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

Java 使用JBoss(6.2.0 GA)的EJB Jar中忽略了Jackson 2注释,java,spring,jboss,jackson,Java,Spring,Jboss,Jackson,我正在将一个web应用程序从Websphere 7(JEE5)迁移到JBoss EAP 6.2.0(JEE6)。它目前在Glassfish 3和WAS中运行良好 web接口使用/生成JSON-so am,使用Jackson2和Spring 3 MVC映射Jackson2HttpMessageConverter,在一个简单的控制器类中处理(反)序列化 在JBoss中,我看到Jackson2注释@JsonProperty等在ejb模块中被忽略(它们仅应用于JPA实体),但是在web模块中被应用。因此

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

web接口使用/生成JSON-so am,使用Jackson2和Spring 3 MVC映射Jackson2HttpMessageConverter,在一个简单的控制器类中处理(反)序列化

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

我尝试了
jboss deployment structure.xml
的每一次修改,但都无济于事(见下文)。我知道JBoss附带Jackson 1.x作为内部模块。然而,这似乎不是问题所在,否则web模块注释也会被忽略?例如:

该应用程序由3个maven模块构成——war、ejb(jar)和ear容器

我将对代码进行重构,以从JPA实体中删除注释,但实际上,找到一致的解决方案会很好,因为还有其他几个应用程序需要迁移

我在下面尝试过的JBoss描述符没有任何区别。 然后在启动web控制器时,我将Mixin连接到Jackson ObjectMapper,该映射器自动连接到控制器中,并在dispatcher 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"/>
。
.
我已经(通过IDE调试器和添加日志记录)找到了用于war模块和EJBJAR模块的不同类加载器。根据文档,这是JBossAS7的默认行为。war使用warModuleLoader,ejb jar使用earModuleLoader

所发生的情况是注释的类因加载注释的类加载器而异。另见:

所谓“不同”,我的意思是它们是相同的注释,来源于相同的jar和版本,但根据equals合同,它们并不被视为等价的,它们的哈希代码不同,因此JacksonAnnotationIntrospector不会定位注释,即使它们显示为与JPA POJO类相反

变通办法 我通过使ear ModuleLoader成为jackson 2的常用加载程序来解决这个问题。为此,我在war&ejb jar中创建com.fasterxml.jackson.core数据绑定依赖项提供的作用域,并在ear-POM中将其标记为正常的编译作用域依赖项

尽管这种方法使用jboss部署结构或MANIFEST.MF实现了几乎相同的功能,但在这里还是得到了认可

 @Autowired
 private ObjectMapper objectMapper;

 @PostConstruct
    void configObjectMapper() {
        objectMapper.addMixInAnnotations(MyEjbJar.class, MyMixin.class);     
    }
.
.
    <bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"/>