JAX-RS - 删除请求POST

时间:2016-02-17 15:51:10

标签: web-services rest java-ee jaxb jax-rs

我将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>{
    ...
    ...
}

请求POST:

{
    userVo:{
        email:"john@gmail.com",
        mobilePhone:1234456
    }
}

客户端需要指定“userVo”(如果我从@XmlRootElement删除UserVo,无法识别对象),但我不想指定它来改善我的REST Api:

{
    email:"john@gmail.com",
    mobilePhone:1234456
}

如果不指定对象名称,则返回错误:

  

16:04:04,278 WARN [http-bio-8080-exec-3] AbstractJAXBProvider:660 -   javax.xml.bind.UnmarshalException     - 链接异常:[com.sun.istack.SAXParseException2; columnNumber:0; elemento inesperado(URI:“”,local:“email”)。洛杉矶   elementos esperados son&lt; {} userVo&gt;]

我找到的唯一方法是接收一个hashmap(客户端发送“APPLICATION_FORM_URLENCODED”类型)并构建对象,但我认为效率较低。

使用JAX-RS有什么想法吗?有可能吗?

对于响应,我使用Gson并将对象返回到我想要的方式:

json = gson.toJson(userVo);
return Response.ok(json, MediaType.APPLICATION_JSON).build();

-

{
    email:"john@gmail.com",
    mobilePhone:1234456
}

1 个答案:

答案 0 :(得分:2)

在发布请求中发送有效内容时,您不需要包含类名。

JAX-RS是java提供的规范。第三方供应商如Jersey,Apache CXF,RestEasy,Restlets实现了JAX-RS。

例如,如果您使用的是Jersey,则使用jersey moxy进行编组/解组。下面是pom.xml中moxy的依赖性/从here

下载它
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
            <version>${jersey.version}</version>
        </dependency>

如果您使用的是Apache cxf,请使用jackson-jaxrs进行编组/解组。下载link

<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实现,为Marshal / Unmarshal添加适当的库,代码应该可以工作。