我如何告诉RESTEasy(一个jax-rs实现),“嘿,当您要求输入IFoo
时,就继续制作一个Foo
对象?”
我目前(错误)的尝试
我有一个我想使用ReportPieceDAO
对象的api访问点。 ReportPieceDAO
作为List<StandardScoreReport>
成员。 StandardScoreReport
是由StandardScoreReportImpl
实现的接口。
@Path("pieces")
@PUT
@Produces("application/json")
@Consumes("application/json")
public Iterable<Long> putReportPiece( List<ReportPieceDAO> reportPieces) {
return getDataCoordinator().updateReportPieces(getAuthenticatedUser(), reportPieces);
}
在添加
List<StandardScoreReport>
成员之前,此入口点运行良好。因为StandardScoreReport
是抽象接口,所以RESTEasy无法自动构造一个接口-它抱怨StandardScoreReport
没有默认构造函数。因此,我想制作某种适配器或提供程序,以在需要
StandardScoreReportImpl
的情况下构造一个StandardScoreReport
:@Provider
@Consumes("application/json")
public class StandardScoreReportProvider implements MessageBodyReader<StandardScoreReport>{
@Override
public boolean isReadable(Class<?> arg0, Type arg1, Annotation[] arg2,
MediaType arg3) {
return true;
}
@Override
public StandardScoreReport readFrom(Class<StandardScoreReport> arg0,
Type arg1, Annotation[] arg2, MediaType arg3,
MultivaluedMap<String, String> arg4, InputStream arg5)
throws IOException, WebApplicationException {
//I'm hoping I can just call some "default" code that
//would run if StandardScoreReportImpl were naturally
//encountered, and not have to write my own unmarshalling code.
return new StandardScoreReportImpl();
}
}
但是这些代码都没有执行过。这是我的应用程序描述:
public class RESTEasyApplicationDescription extends Application
{
HashSet<Class<?>> classes = new HashSet<Class<?>>();
public RESTEasyApplicationDescription()
{
classes.add(APIRoot.class);
classes.add(ReportsRoot.class);
classes.add(StandardScoreReportProvider.class);
classes.add(StandardScoreReport.class);
classes.add(ReportPiece.class);
}
@Override
public Set<Class<?>> getClasses() {
return classes;
}
@Override
public Set<Object> getSingletons() {
return null;
}
}
最佳答案
将应用程序部署到服务器时,将注册提供程序。服务器自动知道句柄如何接收/传递特定对象。
您必须创建一个具有@Provider
的类,如果
从POST创建Java对象,您可以使用:@Consumes
从您可能使用的Web服务调用向响应发送Java对象:@Produces
并指定类型。
例:
我有一项服务,当我打电话时会给我一个PDF,它不会消耗任何东西,只会给我一个pdf文件:
MyService.java
@GET
@Path("/report.{format}")
@Produces({ MediaType.TEXT_HTML, "application/pdf" })
public Response recuperarReporte(){
private ByteArrayOutputStream responseEntity = ....;
Response
.ok()
.entity(responseEntity)
.type("application/pdf").build();
}
MyPDFProvider.java
@Produces("application/pdf")
@Provider
public class MyPDFProvider implements MessageBodyWriter<ByteArrayOutputStream>
{
@Override
public long getSize(ByteArrayOutputStream stream, Class<?> type,
Type genericType, Annotation[] annotations, MediaType mediaType)
{
return stream.size();
}
@Override
public boolean isWriteable(Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType)
{
return ByteArrayOutputStream.class.isAssignableFrom(type);
}
@Override
public void writeTo(ByteArrayOutputStream t, Class<?> type,
Type genericType, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException,
WebApplicationException
{
entityStream.write(t.toByteArray());
}
}