我使用JAX-RS和JAXB注释成功地将POJO编组为JSON。
问题在于,当我尝试使用相同的方法来解组我的请求时,它不起作用。据我所知,documentation JAX-RS可以自动封送和解组应用程序/ json字符串回到java类。
我是否需要为此创建自己的MessageBodyReader,或者框架是否支持此而不使用Jackson库?
答案 0 :(得分:3)
编组到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();
}
答案 1 :(得分:2)
我一直在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,即它有一个默认的构造函数,它有marshaller找到的setter和getter。我在ReqData中没有任何特殊的JSON标记,但我在顶层有@XmlRootElement(name =“data”),用于设置者的XML编组和@XmlElement标记。
我使用单独的bean来输入和输出,但据我所知你可以使用相同的bean。
客户端程序在请求的实体主体中发送JSON字符串,并将Context-Type和Accept头都设置为“application / json”。
答案 2 :(得分:0)
我一直在使用Apache Wink,因此我需要使用JSON提供程序,例如Jettison(一位同事一直在使用Jackson)。我写了我采取的步骤here
我的猜测是你也需要使用JSON提供程序。有没有理由不使用杰克逊提供商?