【问题标题】:In JAX-RS, entire JSON string is being posted在 JAX-RS 中,将发布整个 JSON 字符串
【发布时间】:2017-02-16 21:01:18
【问题描述】:

我有一个接受 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();
}

【问题讨论】:

    标签: java json jersey jax-rs soapui


    【解决方案1】:

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

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

    【讨论】:

    • 它是 JAX RS 标准还是 Jersey 功能?
    • @pedrofb 我不确定这是否是官方标准。就个人而言,我只在 WebSphere Liberty Profile 上将它与 JAX-RS 1.1 一起使用(我相信它使用了 Apache Wink 实现)。
    【解决方案2】:

    你需要一个豆子

     public class Email{
          private String email;
    
         //getters&setters
       }
    

      public Response testJaxRs(Email emailBean){
    

    请注意,您需要添加依赖项来解码 json。例如 Jackson 并将此映射添加到 web.xml 中的 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>
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-07-30
        • 1970-01-01
        • 2018-09-11
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-06
        • 2019-04-23
        相关资源
        最近更新 更多