我将JAX-RS用于RESTful服务,当客户端(angularjs,soapui等(发出请求POST时,需要在json中添加对象名称(根元素(。例如:
@POST
@Path("/create")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createUser (UserVo userVo){
...
...
}
--
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class UserVo implements Serializable, Comparable<UserVo>{
...
...
}
请求发布:
{
userVo:{
email:"john@gmail.com",
mobilePhone:1234456
}
}
客户端需要指定"userVo"(如果我从UserVo
中删除@XmlRootElement
,则无法识别对象(,但我不想指定它来改进我的 REST API:
{
email:"john@gmail.com",
mobilePhone:1234456
}
如果未指定对象名称,则返回错误:
16:04:04,278 警告 [http-bio-8080-exec-3] 摘要JAXBProvider:660 - javax.xml.bind.UnmarshalException - 带有链接异常:[com.sun.istack.SAXParseException2; columnNumber: 0; elemento inesperado (URI:", local:"email"(。洛杉矶 elementos esperados son <{}userVo>]
我发现的唯一方法是接收哈希图(客户端发送" APPLICATION_FORM_URLENCODED
"类型(并构建对象,但我认为它效率较低。
对 JAX-RS 有什么想法吗?可能吗?
对于响应,我使用 Gson 并将对象返回到我想要的方式:
json = gson.toJson(userVo);
return Response.ok(json, MediaType.APPLICATION_JSON).build();
--
{
email:"john@gmail.com",
mobilePhone:1234456
}
post 请求中发送有效负载时,您无需包含类名。
JAX-RS是由java提供的规范。第三方供应商如Jersey,Apache CXF,RestEasy,Restlets实现了JAX-RS。
例如,如果您使用的是泽西岛,则使用泽西岛 moxy 进行编组/解组。以下是pom中moxy的依赖.xml/从这里下载
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>${jersey.version}</version>
</dependency>
如果您使用的是Apache cxf,请使用jackson-jaxrs进行编组/解组。下载链接
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.1.1</version>
</dependency>
然后,您可以将有效负载发布为
{
"email":"john@gmail.com",
"mobilePhone":"1234456"
}
API 和 UserVo 保持原样。
@POST
@Path("/create")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createUser (UserVo userVo){
...
...
}
@XmlRootElement
public class UserVo implements Serializable, Comparable<UserVo>{
...
...
}
现在,根据您的 jax-rs 实现,为元帅/解编组添加适当的库,代码应该可以工作。