我該如何告訴RESTEasy(一個jax-rs實現),「嘿,當你被問到IFoo
時,請繼續做一個Foo
對象?接口的自定義jax-rs實體提供程序?
我現在的(錯誤)試圖
我有,我想消耗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;
}
}
謝謝您的詳細解答!我只是更新了我的問題,以更具體地瞭解我的情況 - 我不需要一種方法將對象寫入輸出流,而是從輸入流中讀取特定對象的方式。我想將所有「StandardScoreReport」實例映射到默認的「StandardScoreReportImpl」解串器。 –