Java 如何在我的web服务中创建自定义JSON/XML响应
我正在使用JAX-RS创建一个web服务。我知道您可以使用JAXB注释对域模型进行注释,然后向后看整个类转换为XML/JSON。但是,这并不适用于我的应用程序中的所有场景。将类编组为XML并不总是合适的。有时我只需要一些字段等,我还希望能够动态添加域模型中未表示的自定义元素 你会怎么做?我需要为此使用其他框架吗?我刚找到格森,值得一看吗?我的资源的XML表示没有那么重要。如果我使用的是GSON,web服务应该用什么响应?那么,您只是使用字符串作为返回类型吗 伪代码,尚未查看GSON。Java 如何在我的web服务中创建自定义JSON/XML响应,java,jakarta-ee,jaxb,jax-rs,Java,Jakarta Ee,Jaxb,Jax Rs,我正在使用JAX-RS创建一个web服务。我知道您可以使用JAXB注释对域模型进行注释,然后向后看整个类转换为XML/JSON。但是,这并不适用于我的应用程序中的所有场景。将类编组为XML并不总是合适的。有时我只需要一些字段等,我还希望能够动态添加域模型中未表示的自定义元素 你会怎么做?我需要为此使用其他框架吗?我刚找到格森,值得一看吗?我的资源的XML表示没有那么重要。如果我使用的是GSON,web服务应该用什么响应?那么,您只是使用字符串作为返回类型吗 伪代码,尚未查看GSON。 在具有多变
在具有多变量响应类型的情况下,最好使用javax.ws.rs.core.response作为返回。这使您能够在运行时完全控制确定将被包装和返回的实际实体 然后,在调用资源方法时,您可以决定返回核心业务对象、业务对象的包装器或自定义序列化版本(作为字符串)。粗伪码:
@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的即时序列化,但同时可以避免转换,通过使用字符串作为实体类型。在具有多变量响应类型的情况下,最好使用javax.ws.rs.core.response作为返回。这使您能够在运行时完全控制确定将被包装和返回的实际实体 然后,在调用资源方法时,您可以决定返回核心业务对象、业务对象的包装器或自定义序列化版本(作为字符串)。粗伪码:
@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的即时序列化,但同时可以通过使用字符串作为实体类型来避免转换。您不应该返回字符串,但是类型
例如:
@Produces(MediaType.APPLICATION_JSON)
public Person String getPerson() {
return personDao.getPerson();
}
请在:jersey json jar
您还应该更改web.xml,以便在Jersey开始支持JSon:
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
com.sun.jersey.api.json.POJOMappingFeature
真的
请记住,我的解决方案不需要执行Person类的特殊注释 不应返回字符串,而应返回类型
例如:
@Produces(MediaType.APPLICATION_JSON)
public Person String getPerson() {
return personDao.getPerson();
}
请在:jersey json jar
您还应该更改web.xml,以便在Jersey开始支持JSon:
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
com.sun.jersey.api.json.POJOMappingFeature
真的
请记住,我的解决方案不需要执行Person类的特殊注释 我知道如何使用json和jersey-您需要说明吗?如果基于这个问题,它们与我想要的内容相关,那么是的。好吧,我在回答中没有使用GSon,但我对jersey和json的了解,我希望这是可以的。我可以告诉你,在工作中,我们使用RESTEasy而不是Jersey,Jackson而不是Gson,但我更愿意为你带来Jersey的代码片段——JAX-RS的RI。我知道如何使用json和Jersey——你想要指令吗?如果基于这个问题,它们与我想要的相关,那么是的。好吧,我在回答中没有使用Gson,但我对Jersey和JSon的了解,我希望这是可以的。我可以告诉你,在工作中我们使用RESTEasy而不是Jersey,Jackson而不是Gson,但我更愿意为你带来Jersey的代码片段——JAX-RS的RI。