【问题标题】:Glassfish JAX-RS JSON Mapping Simple Example Internal Server Error 500 No Logs ProducedGlassfish JAX-RS JSON 映射简单示例内部服务器错误 500 未生成日志
【发布时间】:2013-11-02 21:32:31
【问题描述】:

我创建了一个包含两个资源的简单 REST 服务。第一个资源很好用,只返回 MediaType.TEXT_PLAIN。

对于第二个资源,我想尝试将 POJO 映射到 Java 并遵循以下示例:

https://github.com/jersey/jersey/tree/2.3.1/examples/json-moxy/src/main/java/org/glassfish/jersey/examples/jsonmoxy

我的 testbean 定义为:

@XmlRootElement
public class Company {

    public String name;
    public String symbol;
    public String country;

    public Company(String name, String symbol,
            String country) {
        this.name = name;
        this.symbol = symbol;
        this.country = country;
    }

    public String getName() {
        return name;
    }

    public String getSymbol() {
        return symbol;
    }

    public String getCountry() {
        return country;
    }
}

资源也是微不足道的:

@Path("company/{name}")
public class CompanyResource {

    private Map<String, Company> companies;

    public CompanyResource() {
        companies = new LinkedHashMap<String, Company>();
        companies.put("Apple", new Company("Apple Inc.", "AAPL", "USA"));
        companies.put("Microsoft", new Company("Microsoft Corp.", "MSFT", "USA"));
        companies.put("Honda", new Company("Honda Motor Co Ltd", "HMC", "Japan"));
        companies.put("Random", new Company("Random Inc.", "RND", "Undefined"));
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Company getCompany(@PathParam("name") String name) {
        Company cmp = companies.get(name);
        if (cmp == null) {
            return companies.get("Random");
        }
        return cmp;
    }
}

我已经调试了一个请求并且没有问题地到达返回语句。但是,从这里开始,我认为抛出了 JAXBException,但我无法查看详细信息,并且任何地方的任何日志中都没有出现任何内容。所发生的只是浏览器显示“内部服务器错误 500”消息。

在监控配置下,我绝望地将所有内容都设置为 HIGH。仍然没有任何地方出现。

我发现的唯一类似问题是jax-rs 2.0 and Glassfish 4 unable to @consume JSON into PojoJAX RS Jersey + JSON --> HTTP 500 Internal Server Error,但它们似乎并不完全相关。

对于客户端,我只是将 Google Chrome 与“高级 REST 客户端”应用程序一起使用。

任何帮助将不胜感激。

【问题讨论】:

    标签: json rest jaxb glassfish jax-rs


    【解决方案1】:

    您需要在 Company 类上提供一个无参数构造函数。如果你想限制谁可以访问构造函数,你可以将其设为私有。

    private Company() {
    }
    

    【讨论】:

    • @UmaN - Jersey 团队也意识到了日志记录问题并正在调查它。
    【解决方案2】:

    尝试将参数“名称”放在方法中而不是这样的类中:

    @Path("company")
    public class CompanyResource {
    
        private Map<String, Company> companies;
    
        public CompanyResource() {
            companies = new LinkedHashMap<String, Company>();
            companies.put("Apple", new Company("Apple Inc.", "AAPL", "USA"));
            companies.put("Microsoft", new Company("Microsoft Corp.", "MSFT", "USA"));
            companies.put("Honda", new Company("Honda Motor Co Ltd", "HMC", "Japan"));
            companies.put("Random", new Company("Random Inc.", "RND", "Undefined"));
        }
    
        @GET @PathParam("{name}")
        @Produces(MediaType.APPLICATION_JSON)
        public Company getCompany(@PathParam("name") String name) {
            Company cmp = companies.get(name);
            if (cmp == null) {
                return companies.get("Random");
            }
            return cmp;
        }
    }
    

    如果你想按照你展示的方式使用它,你必须添加一个带有“名称”作为字段的构造函数:

    public CompanyResource(@PathParam("name") String name) {
       this.name = name;
    }
    

    【讨论】:

      【解决方案3】:

      一个 - 不幸的是记录不足 - 可能发生的问题:

      如果您声明一个字段transient 不要用@XmlTransient 注释它transient 字段实际上是 xml 瞬态的,您不再需要注释。

      当我在字段desk 上违反此规则时发生这种情况:

      2016-11-30T14:09:33.731-0500|Severe: 
      com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: IllegalAnnotationException
      Transient field "desk" cannot have any JAXB annotations.
      this problem is related to the following location:
          at @javax.xml.bind.annotation.XmlTransient()
          at my.package.Desk
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-09
        • 1970-01-01
        相关资源
        最近更新 更多