我使用 JAX-RS 和 JAXB 注释成功地将 POJO 编组为 JSON。
问题是,当我尝试使用它来取消编组我的请求时,它不起作用。据我在文档中看到的, JAX-RS 可以自动将 application/json 字符串编组和解组回 java 类。
我是否需要为此创建自己的 MessageBodyReader,或者框架支持此功能而不使用 Jackson 库?
我已经在 RESTEasy 中成功地做到了。我将它设置为使用和生成 XML 和 JSON。这是一个请求处理程序:
@POST
@Produces(["application/json","application/xml"])
@Consumes(["application/json","application/xml"])
@Path("/create")
public Response postCreate(
ReqData reqData) {
log.debug("data.name is "+ data.getName());
...
return Response.status(Response.Status.CREATED)
.entity(whatever)
.location(whateverURI)
.build();
}
ReqData 是一个JavaBean,即它有一个默认构造函数,并且它有编组器找到的setter 和getter。我在 ReqData 中没有任何特殊的 JSON 标记,但我在设置器上的 XML 编组器和 @XmlElement 标记的顶部确实有 @XmlRootElement(name="data")。
我使用单独的 bean 进行输入和输出,但据我所知,您可以使用相同的 bean。
客户端程序在请求的实体正文中发送 JSON 字符串,并将 Context-Type 和 Accept 标头都设置为“application/json”。
编组为 XML 很容易,但我花了一段时间才弄清楚如何编组为 JSON。找到解决方案后很简单。
public static String marshalToXml( Object o ) throws JAXBException {
StringWriter writer = new StringWriter();
Marshaller marshaller = JAXBContext.newInstance( o.getClass() ).createMarshaller();
marshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );
marshaller.marshal( o, writer );
return writer.toString();
}
public static String marshalToJson( Object o ) throws JAXBException {
StringWriter writer = new StringWriter();
JAXBContext context = JSONJAXBContext.newInstance( o.getClass() );
Marshaller m = context.createMarshaller();
JSONMarshaller marshaller = JSONJAXBContext.getJSONMarshaller( m );
marshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );
marshaller.marshallToJSON( o, writer );
return writer.toString();
}
我一直在使用 Apache Wink,为此我需要使用 JSON 提供程序,例如 Jettison(一位同事一直在使用 Jackson)。我写下了我在这里采取的步骤
我的猜测是您也需要使用 JSON 提供程序。是否有理由不使用杰克逊提供者?