【问题标题】:Hot to edit JSON object output with Jersey & Netbeans?使用 Jersey 和 Netbeans 编辑 JSON 对象输出很热门?
【发布时间】:2011-10-25 11:30:36
【问题描述】:

我的 RESTful 网络服务有问题 - 再次 :( 概括: 当我调用这个 URL 时:

http://localhost:8080/iOSWebServices/resources/credits/1

我得到这个 JSON 输出:

{"id":1,"lastname":null,"firstname":"lalsdaksldlasds"}

但我想要这个 JSON 输出:

{"creditRequest":{"id":1,"lastname":null,"firstname":"lalsdaksldlasds"}}

长版: 我正在使用 netbeans、glassfish 3 和 jersey 1.9.1 来提供一些简单的测试 web 服务。问题是,所有 json 输出都缺少输出中的类名...

对于上面的例子: CreditRequest.java

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "creditRequest")
@XmlType(name = "creditRequestType")
@XmlAccessorType(XmlAccessType.FIELD)
public class CreditRequest {

    private Long id;
    private String firstname;
    private String lastname;

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }
}

CreditRequest.java

import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

@Path("credits")
@RequestScoped
public class CreditsResource {

    @Context
    private UriInfo context;

    /** Creates a new instance of CreditsResource */
    public CreditsResource() {
    }

    //OUTPUT AS ABOVE!
    @GET
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getCreditById(@PathParam("id") long id) {
        System.out.println("getCreditById");
        CreditRequest creditRequest = new CreditRequest();
        creditRequest.setId(new Long(1));
        creditRequest.setFirstname("lalsdaksldlasds");
        return Response.ok().entity(creditRequest).build();        
    }
}

球衣用户指南解释了应该如何工作 - 引用...

Example 5.14. Keep XML root tag equivalent in JSON mapped JSON notation
    JSONConfiguration.mapped().rootUnwrapping(false).build()
and get the following JSON for our Contact bean:
Example 5.15. XML root tag equivalent kept in JSON using mapped notation
    {"contact":{ "id":"2" 
     ,"name":"Bob"
     ,"addresses":{"street":"Long Street 1"
                        ,"town":"Short Village"}}}

为此,我编写了一个实现 ContextResolver 的简单类(也在用户指南中)

JAXBContextResolver.java //似乎不起作用

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {

    private JAXBContext context;
    private Class[] types = {CreditRequest .class}; //FIXED

    public JAXBContextResolver() throws Exception {

        System.out.println("init");
        this.context = new JSONJAXBContext(
                JSONConfiguration.mapped().rootUnwrapping(false).build(), types);
    }

    @Override
    public JAXBContext getContext(Class<?> objectType) {
        System.out.println("get");
        for (Class type : types) {
            if (type == objectType) {
                return context;
            }
        }
        return null;
    }
}

当我启动 web 服务时,在 JAXBContextResolver 的构造函数中定义的输出将被写入“init” - 但是 “得到”不会....

在这个项目中,netbeans 控制我的 web 服务的资源 - 并且再次初始化 服务器启动时的 JAXBContextResolver - 但仍然没有 rootUnwrapping :(

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
       <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

有什么想法吗?我真的不知道为什么我的 JSON 输出没有变化 :(

【问题讨论】:

    标签: java json rest jersey glassfish-3


    【解决方案1】:

    上周我遇到了同样的问题。我在 web.xml 文件中找到了解决方案。在我删除以下行之后:

    <init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
    </init-param>
    

    【讨论】:

      【解决方案2】:

      我注意到 JAXBContextResolver.types 数组包含 CreditsResource 应该是 CreditRequest 类的位置。
      虽然,这可以解释为什么 CreditRequest 的 JSON 输出没有变化,而不是为什么没有打印“get”消息......

      【讨论】:

      • True - 更改为 CreditRequest 但这并没有解决问题:(
      【解决方案3】:

      这几乎就像没有找到 Provider 类。您说 Netbeans 控制您的资源,但不是 Glassfish(以及最终的球衣)扫描/加载 Resource 和 Provider 类吗? Glassfish 是否需要任何配置才能知道在哪里查看?在 Tomcat 中,此属性在 servlet config 中设置:“com.sun.jersey.config.property.packages”。

      我试过你的例子,你有它,rootUnwrapping 在 Eclipse 中与 Tomcat 6 和 Jersey 1.4 一起工作。

      【讨论】:

        【解决方案4】:

        不知道这是否是最好的解决方案,但可以解决问题...... 我为 CreditRequest 编写了一个包装类

        CreditRequestWrapper

        @XmlType(name = "creditRequestType")
        @XmlAccessorType(XmlAccessType.FIELD)
        public class CreditRequestWrapper {
        
            @XmlElement(name = "creditRequest")
            private CreditRequest creditRequest;
        
            public CreditRequestWrapper() {
            }
        
            public CreditRequestWrapper(CreditRequest creditRequest) {
                this.creditRequest = creditRequest;
            }
        
            public CreditRequest getCreditRequest() {
                return creditRequest;
            }
        
            public void setCreditRequest(CreditRequest creditRequest) {
                this.creditRequest = creditRequest;
            }
        }
        

        还有我资源中的@GET

        @GET
        @Path("{id}")
        @Produces(MediaType.APPLICATION_JSON)
        public Response getCreditById(@PathParam("id") long id) {
            System.out.println("getCreditById");
            CreditRequest creditRequest = new CreditRequest();
            creditRequest.setId(new Long(1));
            creditRequest.setFirstname("lalsdaksldlasds");
            return Response.ok().entity(new CreditRequestWrapper(creditRequest)).build();
        }
        

        现在我得到了我想要的......

        {"creditRequest":{"id":1,"firstname":"lalsdaksldlasds","creditVolume":0.0,"creditRate":0.0}}
        

        但我真的很想知道为什么官方方法对我不起作用-.-

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-05
          • 2017-12-17
          • 1970-01-01
          相关资源
          最近更新 更多