Jackson 2注解在JBoss(6.2.0 GA)的EJB Jar中被忽略。

5
我正在将一个Web应用从Websphere 7 (JEE5)迁移到JBoss EAP 6.2.0 (JEE6)。它目前在Glassfish 3和WAS中正常工作。
Web界面使用JSON进行消耗/生产 - 因此在简单的控制器类中使用Jackson2与Spring 3 MVC的MappingJackson2HttpMessageConverter来处理(反)序列化。
在JBoss中,我看到Jackson2注释@JsonProperty等在ejb模块中被忽略 - (仅应用于JPA实体),但在web模块中被应用。因此,在JBoss中,一些对象的响应具有不同的字段名称,这使我们的用户界面出现问题。
我尝试了每个jboss-deployment-structure.xml的排列组合,但无济于事(见下文)。我知道JBoss提供了Jackson 1.x作为内部模块。然而,这似乎不是问题,否则Web模块的注释也会被忽略?例如:Jackson annotations ignored after deployment to JBOSS 该应用程序被组织为3个Maven模块 - war,ejb(jar)和ear容器。
我将重构代码以删除JPA实体中的注释,但真正需要找到一个连贯的解决方案,因为还有其他几个应用程序需要迁移。
我尝试过下面的JBoss描述符,但没有任何区别。
<jboss-deployment-structure>
    <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
    <deployment>
        <exclusions>
            <module name="org.codehaus.jackson.jackson-core-asl"/>
            <module name="org.codehaus.jackson.jackson-mapper-asl"/>
        </exclusions>
    </deployment>
    <sub-deployment name="my-war.war">
        <exclusions>
            <module name="org.codehaus.jackson.jackson-core-asl"/>
            <module name="org.codehaus.jackson.jackson-mapper-asl"/>
        </exclusions>
    </sub-deployment>
    <sub-deployment name="my-ejbs.jar">
        <exclusions>
            <module name="org.codehaus.jackson.jackson-core-asl"/>
            <module name="org.codehaus.jackson.jackson-mapper-asl"/>
        </exclusions>
    </sub-deployment>
</jboss-deployment-structure>

初始解决方法(已撤销)

虽然它没有解决原始问题的根本原因,但我通过在Web模块中添加Jackson Mixin来重命名/抑制相关字段来解决了这个问题。我测试过它,它可以正常工作。

关于所有这些的要点是,通过使用Jackson Mixin,序列化的自定义范围被限制在Web模块中,从而避免了由于ejb-jar子部署而可能出现的类加载问题。没有使用jboss-deployment-structure.xml

添加一个Mixin

public interface MyMixin {


    @JsonIgnore
    String getUnwantedField();

    @JsonProperty(value = "newName")
    String getOldName();

}

然后,在我的Web控制器启动时,我将Mixin连接到Jackson ObjectMapper中,该ObjectMapper已自动装配到控制器中,并在我的调度程序servlet xml配置中定义。

 @Autowired
 private ObjectMapper objectMapper;

 @PostConstruct
    void configObjectMapper() {
        objectMapper.addMixInAnnotations(MyEjbJar.class, MyMixin.class);     
    }

调度servlet:

.
.
    <bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"/>
1个回答

1
我已经通过IDE调试器和添加日志追踪到这一点,原因是war模块和ejb jar模块使用了不同的类加载器。根据文档,这是JBoss AS 7的预期默认行为。war使用war ModuleLoader,而ejb jar使用ear ModuleLoader。
发生的情况是注解的类取决于哪个类加载器加载注解。也可以参考: SO上的类似问题 “不同”指的是它们是相同的注解,来自同一个jar和版本,但根据equals的约定,它们被视为不相等,它们的哈希码不同,因此JacksonAnnotationIntrospector无法定位注解,即使它们显示为针对JPA POJO类保留。
解决方法:
我已经通过将 ear ModuleLoader 作为 jackson 2 的通用加载器来解决了这个问题。我在 war 和 ejb jar 中将 com.fasterxml.jackson.core databind 依赖项设置为 provided 范围,并在 ear POM 中将其标记为普通的编译范围依赖项,从而实现了此目的。这种方法在 JBoss AS classloading中得到了认可,尽管它使用 jboss-deployment-structure 或 MANIFEST.MF 来实现几乎相同的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接