[英]How to create custom JSON/XML responses in my web service
我正在使用JAX-RS创建Web服务。 我知道您可以使用JAXB批注来批注领域模型,然后向后倾斜并观察整个类是否已转换为XML / JSON。 但是,这并不适合我的应用程序中的所有情况。 将类编组为XML并不总是合适的。 有时,我只需要一些字段等,并且我还希望能够动态添加自定义元素,而这在域模型中是无法表示的。
你会怎么做? 我是否需要为此使用其他框架? 我刚刚找到GSON,值得一看吗? 我的资源的XML表示并不那么重要。 如果我使用的是GSON,那么Web服务应该响应什么? 那么,您是否仅使用String作为返回类型?
伪代码,尚未查看GSON。
@Produce("application/json")
public String someMethod() {
return gson.toJSON();
}
在具有多变量响应类型的情况下,通常最好使用javax.ws.rs.core.Response作为返回值。 这样,您可以在运行时完全控制确定要包装并返回的实际实体。
然后,在调用资源方法时,您可以决定返回核心业务对象,业务对象周围的包装器或自定义序列化版本(作为String)。 粗糙的伪代码:
@Produce("application/json")
public Response someMethod() {
switch(mySpecialCase) {
case 1:
return Response.ok(coreEntity).build(); break;
case 2:
return Response.ok(new LiteEntity(coreEntity)).build(); break;
case 3:
return Response.ok(Util.toGSON(coreEntity).toString()).build(); break;
}
}
这种方法的优势之一是服务器端拦截器仍将触发并在您的实体对象上执行转换,因此您仍然可以利用即时序列化到JSON和XML的优势,但同时可以规避转换,通过使用String作为实体类型。
您不应返回字符串,而应返回类型。
例如:
@Produces(MediaType.APPLICATION_JSON)
public Person String getPerson() {
return personDao.getPerson();
}
请在以下位置添加依赖项(例如,通过maven):
jersey-json罐
您还应该更改web.xml,以通过Jersey开始对JSon的支持:
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
没关系,我的解决方案不需要对Person类进行特殊注释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.