我正在将一个web应用程序从Websphere 7(JEE5)迁移到JBoss EAP 6.2.0(JEE6)。它目前在Glassfish 3&是。
web界面使用/生成JSON-所以我使用Jackson2和Spring3MVC
映射Jackson2HttpMessageConverter
涉及在一个简单的控制器类中处理(去)串行化。
在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)&耳容器。
我将重构代码以从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震击器
子部署。不
jboss-deployment-structure.xml
正在使用。
添加Mixin
public interface MyMixin {
@JsonIgnore
String getUnwantedField();
@JsonProperty(value = "newName")
String getOldName();
}
然后在启动我的web控制器时,我将Mixin连接到Jackson ObjectMapper,它自动连接到控制器中,并在我的调度器servlet xml配置中定义。
@Autowired
private ObjectMapper objectMapper;
@PostConstruct
void configObjectMapper() {
objectMapper.addMixInAnnotations(MyEjbJar.class, MyMixin.class);
}
Dispatcher servlet:
.
.
<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"/>