首页 文章

使用JBoss(6.2.0 GA)在EJB Jar中忽略了Jackson 2注释

提问于
浏览
3

我正在将Web应用程序从Websphere 7(JEE5)迁移到JBoss EAP 6.2.0(JEE6) . 它目前在Glassfish 3和WAS中运行良好 .

Web界面消耗/生成JSON - 所以我使用Jackson2和Spring 3 MVC MappingJackson2HttpMessageConverter在一个简单的控制器类中处理(de)序列化 .

在JBoss中,我看到Jackson2注释@JsonProperty等在ejb模块中被忽略 - (它们仅应用于JPA实体),但是 are 正在web模块中应用 . 因此,对于JBoss中的某些对象,响应会返回不同的字段名称,这会使我们的用户界面瘫痪 .

我已经尝试了所有的 jboss-deployment-structure.xml 无效(见下文) . 我似乎是问题所在,否则web模块注释也会被忽略?例如:Jackson annotations ignored after deployment to JBOSS

该应用程序的结构为3个maven模块 - war,ejb(jar)和耳塞 .

我将重构代码以从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,它自动连接到控制器并在我的调度程序servlet xml config中定义 .

@Autowired
 private ObjectMapper objectMapper;

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

Dispatcher 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 .

    会发生什么是注释的类根据哪个类加载器加载注释而不同 . 另见:similar issue on SO

    "differs"我的意思是它们是相同的注释,源自相同的jar和版本,但是根据equals的 Contract 它们被认为是等价的,它们的哈希码不同,因此JacksonAnnotationIntrospector没有找到注释,即使它们显示为对JPA POJO班 .

    解决方法

    我已经解决了这个问题,通过使得ModuleLoader成为jackson 2的常见加载器 . 我通过在war&ejb jar中创建com.fasterxml.jackson.core数据绑定依赖提供范围并将其标记为普通编译范围来实现此目的 . 依赖于耳朵POM .

    虽然它使用jboss-deployment-structure或MANIFEST.MF来实现几乎相同的东西,但这种方法在这里得到了认可JBoss AS classloading .

相关问题