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

时间:2017-02-16 21:01:19

标签: java json jersey jax-rs soapui

我有一个接受JSON的简单Jersey POST方法。我正在使用SOAP UI来测试,使用POST和媒体类型应用程序/ JSON。 在请求正文中,我有JSON:

{
    email:"test"
}

当我测试这个时,我希望作为测试进入服务的字符串实际上是整个JSON字符串。不知道这里有什么问题,它应该根据文档工作。

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

3 个答案:

答案 0 :(得分:2)

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

public Response testJaxRs(Map<String, String> body) {
    body.get("email") // "test"
    ...

答案 1 :(得分:1)

如果您正在使用Jersey 1.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的<init-param>,添加指向您的控制器包的一个或多个包(由,分隔)。例如,在web.xml

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

答案 2 :(得分:1)

你需要一个豆

 public class Email{
      private String email;

     //getters&setters
   }
  public Response testJaxRs(Email emailBean){

请注意,您需要添加依赖项来解码json。例如Jackson并在web.xml&gt;中将此映射添加到jersey servlet。请参阅此处的完整示例:https://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

<web-app ...>

<servlet>
  <servlet-name>jersey-servlet</servlet-name>
  <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
  <init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>com.yourpackage</param-value>
  </init-param>
  <init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>