Glassfish 4 REST XML 工作 JSON 错误

Posted

技术标签:

【中文标题】Glassfish 4 REST XML 工作 JSON 错误【英文标题】:Glassfish 4 REST XML Working JSON Error 【发布时间】:2015-09-25 08:22:36 【问题描述】:

我在 Glassfish 4.1 上有一个 Web 服务,它可以正常用于 XML,但不能用于 JSON。

实体类是:

@XmlRootElement
public class Person implements Serializable 
    /**
     * 
     */
    private static final long serialVersionUID = -8969081094076790550L;
    Integer id;
    String firstName;
    String lastName;
    String employeeId;

    /**
     * 
     */
    public Person() 
    

    @Override
    public String toString() 
        return firstName + " " + lastName + " [" + employeeId + "] [id: " + id + "]";
    
    /**
     * @return the firstName
     */
    public String getFirstName() 
        return this.firstName;
    
    /**
     * @param firstName the firstName to set
     */
    public void setFirstName(String firstName) 
        this.firstName = firstName;
    
    /**
     * @return the lastName
     */
    public String getLastName() 
        return this.lastName;
    
    /**
     * @param lastName the lastName to set
     */
    public void setLastName(String lastName) 
        this.lastName = lastName;
    
    /**
     * @return the employeeId
     */
    public String getEmployeeId() 
        return this.employeeId;
    
    /**
     * @param employeeId the employeeId to set
     */
    public void setEmployeeId(String employeeId) 
        this.employeeId = employeeId;
    
    /**
     * @return the id
     */
    public Integer getId() 
        return this.id;
    
    /**
     * @param id the id to set
     */
    public void setId(Integer id) 
        this.id = id;
    


相关服务代码为:

@GET
@Path("xml")
@Produces(MediaType.TEXT_XML)
public Collection<Person> getPeopleXML() 
    return personDao.getAllPeople(); 


@GET
@Path("json")
@Produces(MediaType.APPLICATION_JSON)
public Collection<Person> getPeopleJSON() 
    return personDao.getAllPeople(); 

XML 调用有效,我得到:

<people>
 <person>
  <employeeId>2234</employeeId>
  <firstName>Mike</firstName>
  <id>2</id>
  <lastName>Jones</lastName>
 </person>
 <person>
  <employeeId>22314</employeeId>
  <firstName>Joe</firstName>
  <id>4</id>
  <lastName>Smith</lastName>
 </person>
</people>

我收到 JSON 调用错误:

HTTP 状态 500 - 内部服务器错误

输入异常报告

消息内部服务器错误

描述服务器遇到阻止它的内部错误 完成此请求。

异常

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector 根 原因

org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector 根 原因

java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector 根 原因

java.lang.ClassNotFoundException: com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector 未找到 通过 com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider [129] 注意 异常的完整堆栈跟踪及其根本原因是 GlassFish Server Open Source Edition 4.1 日志中提供。

为什么会出错?我有我需要的一切,我想。我有一个常春藤文件并尝试添加各种杰克逊部门,但似乎没有任何效果。当我将 jackson 添加到我的 ivy 文件时,我无法判断我是否有版本问题,因为它包含在 Glassfish 中,或者什么。

Glassfish 提供以下功能:

/d/glassfish4/glassfish/modules/jackson-annotations.jar
/d/glassfish4/glassfish/modules/jackson-core.jar
/d/glassfish4/glassfish/modules/jackson-databind.jar
/d/glassfish4/glassfish/modules/jackson-jaxrs-base.jar
/d/glassfish4/glassfish/modules/jackson-jaxrs-json-provider.jar
/d/glassfish4/glassfish/modules/jersey-media-json-jackson.jar

【问题讨论】:

【参考方案1】:

解决办法如下:

    停止玻璃鱼

    删除 Glassfish 模块目录中的所有 jackson 内容。

    删除domains/domain1/osgi-cache/felix目录

    将以下文件复制到该目录:

/glassfish/modules/jackson-annotations-2.4.0.jar

/glassfish/modules/jackson-annotations-2.5.0.jar

/glassfish/modules/jackson-core-2.4.2.jar

/glassfish/modules/jackson-core-2.5.4.jar

/glassfish/modules/jackson-databind-2.4.2.jar

/glassfish/modules/jackson-databind-2.5.4.jar

/glassfish/modules/jackson-jaxrs-base-2.5.4.jar

/glassfish/modules/jackson-jaxrs-json-provider-2.5.4.jar

/glassfish/modules/jackson-module-jaxb-annotations-2.4.2.jar

/glassfish/modules/jackson-module-jaxb-annotations-2.5.4.jar

/glassfish/modules/jersey-media-json-jackson.jar

然后就可以了。不确定 Jackson 的原始文件是什么版本,但这可以工作并升级您的 jackson 模块版本。

【讨论】:

哇,这确实是 Glassfish 中的一个大错误。在 WildFly 中,它开箱即用。感谢您自己回答! 是的,我已经放弃了 Glassfish 并搬到了 WildFly。 Glassfish 有太多像这样的错误,浪费了我太多时间。 你帮了我大忙! 好,我很确定你不需要两个版本的 jackson 东西,但我已经放弃了 Glassfish,所以我无法测试。 谢谢先生,您拯救了我的一天。一件事:就我而言,除了 /glassfish/modules/jersey-media-json-jackson.jar 之外,我做了你在该列表中指出的所有事情。【参考方案2】:

我有同样的问题,我与它斗争了好几天。 问题是 glashfish 4.1.1 中缺少 jar 文件( jackson-module-jaxb-annotations )。您可以从此链接http://www.java2s.com/Code/Jar/j/Downloadjacksonmodulejaxbannotations212jar.htm 下载它或谷歌下载jackson 模块jaxb 注释。 然后将其包含在 C:\Program Files\glassfish-4.1.1\glassfish\modules 目录中。您可以通过删除版本号来重命名 jar 文件。重新启动 glassfish 并重新部署您的应用程序。这样对我有用

【讨论】:

【参考方案3】:

这里同样的问题,在我的例子中,我的 pom.xml 重新部署并准备好了,只是在我的 pom.xml 中包含了“Jackson Module: JAXB Annotations”的 maven 存储库。我不得不进行两次 http 调用,我真的不知道为什么,但这在第二次调用(GET/POST http 请求)中对我有用。

希望这对其他人有所帮助。

【讨论】:

以上是关于Glassfish 4 REST XML 工作 JSON 错误的主要内容,如果未能解决你的问题,请参考以下文章

休息,glassfish4 shiro 启用工作样本

在模拟已获得 glassfish 服务器授权的用户时调用 REST 服务

无法为JAX-B生成架构,仅在CORS调用REST服务期间发生

泽西 REST API:java.lang.NoSuchMethodError:org.glassfish.jersey.message.filtering.EntityFilteringFeatur

Glassfish 4.1.1 - alternatedocroot_1

如何在 Glassfish 中允许该权限