我正在将一个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描述符,但没有任何区别。
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"/>