【问题标题】:Spring Boot data-rest Jakson JSONSerializer emptySpring Boot 数据休息 Jakson JSONSerializer 为空
【发布时间】:2016-08-06 03:03:57
【问题描述】:

我有一个 Spring Boot 项目 1.3.3-Release,已部署到 Web Logic 12c 应用服务器上。此代码在嵌入式 tomcat 上运行良好,但在我部署到 Web Logic 时却不行。

我有一个 Spring Data-Rest 存储库

@RepositoryRestResource(collectionResourceRel = "car", path = "car")
public interface CarRepo extends PagingAndSortingRepository<Meter, Long>
{
    List<Car> findall();
}

我的车 POJO

@Table(name="car")
@Entity
public class Car
{
   @Id
   @Column(name="ID")
   private Long id;

   @Column(name="manufacturer")
   private String manufacturer;

   .......
}

一切都启动并加载网页,当我进行其余调用时,我可以看到来自 SQL 输出的 SQL 查询执行良好,但随后我在服务器日志中收到以下错误:

java.lang.AbstractMethodError: com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:528) 处的 com.fasterxml.jackson.databind.JsonSerializer.isEmpty(Ljava/lang/Object;)

我假设 data-rest 正在尝试将 JSON 响应从端点自动映射到 Car 对象,但由于某种未知原因它失败了。

我从下面的链接中看到,我知道 spring-data-rest 使用的 Spring-Hateoas 存在问题,但似乎我使用的是最新版本的 spring-data-rest,这不应该是一个问题。

spring-hateoas error

任何帮助将不胜感激

【问题讨论】:

    标签: java spring rest spring-boot jackson


    【解决方案1】:

    这看起来像是 JsonSerializer 类的版本不匹配问题。我认为您的 weblogic 类加载器正在加载旧版本的 com.fasterxml.jackson.core:jackson-databind,其中 JsonSerializer 类没有 isEmpty 方法。

    来自文档:

    /**
     * Method called to check whether given serializable value is
     * considered "empty" value (for purposes of suppressing serialization
     * of empty values).
     *<p>
     * Default implementation will consider only null values to be empty.
     * 
     * @since 2.0
     */
    public boolean isEmpty(T value) {
        return (value == null);
    }
    

    【讨论】:

    • 感谢您的回复。这是一个 maven 项目,所以它在那里定义了要加载的版本,所以我对 weblogic 如何覆盖它感到困惑?
    • 我的意思是,当应用程序在 Weblogic 内部启动时,weblogic 可能有上述类的冲突版本,并且正在从它的类路径加载它。这就是为什么您的应用在使用嵌入式 tomcat 独立运行时可以工作的原因
    • 很抱歉这么晚才回来,但您的回答帮助我获得了正确的结果。我不得不告诉 weblogic 服务器使用应用程序中的 com.fasterxml.jackson 包,而不是使用它自己的包。非常感谢@anwarc
    【解决方案2】:

    好的,所以解决方案是我必须在 weblogic.xml 中专门告诉 weblogic 从应用程序加载 com.fasterxml.jackson 包,而不是从它自己的容器中加载。

    <wls:package-name>com.fasterxml.jackson.*</wls:package-name>
    

    完整的 weblogic.xml 如下:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" 
                          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 
                                              http://xmlns.oracle.com/weblogic/weblogic-web-app 
                                              http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
        <wls:weblogic-version>12.2.1</wls:weblogic-version>
        <wls:context-root>/ws/car</wls:context-root>
        <wls:container-descriptor>
            <wls:prefer-application-packages>
                <wls:package-name>org.slf4j.*</wls:package-name>
                <wls:package-name>javax.persistence.*</wls:package-name>
                <wls:package-name>org.springframework.*</wls:package-name>
                <wls:package-name>com.fasterxml.jackson.*</wls:package-name>
            </wls:prefer-application-packages>
        </wls:container-descriptor> </wls:weblogic-web-app>
    

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

    【讨论】:

      猜你喜欢
      • 2018-06-03
      • 2021-10-28
      • 2019-07-10
      • 1970-01-01
      • 2018-08-28
      • 2019-03-16
      • 2019-08-28
      • 2017-11-19
      • 1970-01-01
      相关资源
      最近更新 更多