Java 在JAX-RS中,将发布整个JSON字符串

Java 在JAX-RS中,将发布整个JSON字符串,java,json,jersey,jax-rs,soapui,Java,Json,Jersey,Jax Rs,Soapui,我有一个简单的Jersey POST方法,它接受JSON。我使用soapui进行测试,使用POST和媒体类型application/JSON。 在请求主体中,我有JSON: { email:"test" } 当我测试这个时,我期望作为测试进入服务的字符串实际上作为整个JSON字符串进入服务。不确定这里出了什么问题,应该根据文件来处理 @POST @Path("/TEST") @Consumes(MediaType.APPLICATION_JSON) public Response te

我有一个简单的Jersey POST方法,它接受JSON。我使用soapui进行测试,使用POST和媒体类型application/JSON。 在请求主体中,我有JSON:

{
    email:"test"
}
当我测试这个时,我期望作为测试进入服务的字符串实际上作为整个JSON字符串进入服务。不确定这里出了什么问题,应该根据文件来处理

@POST
@Path("/TEST")
@Consumes(MediaType.APPLICATION_JSON)
public Response testJaxRs(String email){
    //  email = "{
    //      email:"test"
    //  }"
    return Response.ok().build();
}

如果您使用的是Jersey1.x,那么要将Json作为对象接收,您需要声明POJO并使用
javax.xml.bind.annotation.XmlRootElement
对其进行注释:

@XmlRootElement
public class EmailTest{

    String email;

    public String getEmail(){
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
然后您必须在控制器中使用此类:

@POST
@Path("/TEST")
@Consumes(MediaType.APPLICATION_JSON)
public Response testJaxRs(Email email){
    System.out.println(email.getEmail()); // prints "test"
    return Response.ok().build();
}
最后,您必须将
com.sun.jersey.config.property.packages
添加为servlet的
,添加指向控制器包的一个或多个包(用
分隔)。例如,在
web.xml
中:

<init-param>
   <param-name>com.sun.jersey.config.property.packages</param-name>
   <param-value>org.app.controllers</param-value>
</init-param>

com.sun.jersey.config.property.packages
org.app.controllers

如果您使用的是Jersey1.x,那么要将Json作为对象接收,您需要声明POJO并使用
javax.xml.bind.annotation.XmlRootElement

@XmlRootElement
public class EmailTest{

    String email;

    public String getEmail(){
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
然后您必须在控制器中使用此类:

@POST
@Path("/TEST")
@Consumes(MediaType.APPLICATION_JSON)
public Response testJaxRs(Email email){
    System.out.println(email.getEmail()); // prints "test"
    return Response.ok().build();
}
最后,您必须将
com.sun.jersey.config.property.packages
添加为servlet的
,添加指向控制器包的一个或多个包(用
分隔)。例如,在
web.xml
中:

<init-param>
   <param-name>com.sun.jersey.config.property.packages</param-name>
   <param-value>org.app.controllers</param-value>
</init-param>

com.sun.jersey.config.property.packages
org.app.controllers
你需要一个豆子

 public class Email{
      private String email;

     //getters&setters
   }

注意,您需要添加依赖项来解码json。e、 g Jackson并将此映射添加到
web.xml
>中的jersey servlet请参见此处的完整示例:


泽西servlet
com.sun.jersey.spi.container.servlet.ServletContainer
com.sun.jersey.config.property.packages
com.yourpackage
com.sun.jersey.api.json.POJOMappingFeature
真的
1.
你需要一个豆子

 public class Email{
      private String email;

     //getters&setters
   }

注意,您需要添加依赖项来解码json。e、 g Jackson并将此映射添加到
web.xml
>中的jersey servlet请参见此处的完整示例:


泽西servlet
com.sun.jersey.spi.container.servlet.ServletContainer
com.sun.jersey.config.property.packages
com.yourpackage
com.sun.jersey.api.json.POJOMappingFeature
真的
1.

如果不想将其反序列化为bean,那么可以接受post正文作为键值对的映射。例如:

public Response testJaxRs(Map<String, String> body) {
    body.get("email") // "test"
    ...
公共响应testJaxRs(映射体){
body.get(“电子邮件”)/“测试”
...

如果不想将其反序列化为bean,则可以接受post正文作为键值对的映射。例如:

public Response testJaxRs(Map<String, String> body) {
    body.get("email") // "test"
    ...
公共响应testJaxRs(映射体){
body.get(“电子邮件”)/“测试”
...

它是JAX-RS标准还是Jersey功能?@pedrofb我不确定它是否是官方标准。就我个人而言,我只在WebSphere Liberty Profile上使用过JAX-RS 1.1(我相信它使用的是Apache Wink实现)。它是JAX-RS标准还是Jersey功能?@pedrofb我不确定它是否是官方标准。就我个人而言,我只在WebSphere Liberty Profile上使用过JAX-RS 1.1(我相信它使用Apache Wink实现)。