Jax-RS MessageBodyReader
我正在学习MessageBodyReader方法如何从提供者工作。 我看到该方法返回一个对象,我不知道如何从服务访问该对象。 我可以获得如何从读者类返回对象的解释吗? 这将有助于我为所有dto应用阅读规则。 提前致谢!
服务:
@POST @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Path("/CreateAccount") @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public Response createAccount(@Context HttpServletRequest req) { String a = "Reader success? ";//Would to see that string here! return Response.ok().build(); }
提供者:
@Provider public class readerClass implements MessageBodyReader { @Override public boolean isReadable(Class paramClass, Type paramType, Annotation[] paramArrayOfAnnotation, MediaType paramMediaType) { // TODO Auto-generated method stub return true; } @Override public Object readFrom(Class paramClass, Type paramType, Annotation[] paramArrayOfAnnotation, MediaType paramMediaType, MultivaluedMap paramMultivaluedMap, InputStream paramInputStream) throws IOException, WebApplicationException { // TODO Auto-generated method stub return "Successfully read from a providers reader method"; } }
您误解了MessageBodyReader的用途,它用于以下目的:
支持将流转换为Java类型的提供程序的合同。 要添加MessageBodyReader实现,请使用@Provider注释实现类。 MessageBodyReader实现可以使用Consumes注释,以限制它被认为适合的媒体类型
示例:如果您有一个用例来自xml / json以外的自定义格式,您想提供自己的UnMarshaller,您可以使用messagebody reader
@Provider @Consumes("customformat") public class CustomUnmarshaller implements MessageBodyReader { @Override public boolean isReadable(Class aClass, Type type, Annotation[] annotations, MediaType mediaType) { return true; } @Override public Object readFrom(Class aClass, Type type, Annotation[] annotations, MediaType mediaType, MultivaluedMap multivaluedMap, InputStream inputStream) throws IOException, WebApplicationException { Object result = null; try { result = unmarshall(inputStream, aClass); // un marshall custom format to java object here } catch (Exception e) { e.printStackTrace(); } return result; } }
在webservice中你可以使用它像..
@POST @Path("/CreateAccount") @Consumes("custom format") public Response createAccount(@Context HttpServletRequest req,Account acc) { saveAccount(acc); // here acc object is returned from your custom unmarshaller return Response.ok().build(); }
更多信息 : 自定义编组/ UnMarshalling示例 , Jersy实体提供程序教程