我正在将Web应用程序从Websphere 7(JEE5)迁移到JBoss EAP 6.2.0(JEE6)。它目前在Glassfish 3& WAS。
Web界面消耗/生成JSON - 所以我使用Jackson2和Spring 3 MVC MappingJackson2HttpMessageConverter 来处理(de)一个简单控制器类中的序列化。
在JBoss中,我看到在ejb模块中忽略了Jackson2注释 @JsonProperty 等 - (它们仅适用于JPA实体),但 正在应用于网络模块。因此,对于JBoss中的某些对象,响应会返回不同的字段名称,这会使我们的用户界面瘫痪。
我已经尝试jboss-deployment-structure.xml
的每一个遗漏都无济于事(见下文)。我知道JBoss将Jackson 1.x作为内部模块。但是,这似乎不是问题,否则Web模块注释也会被忽略?例如:Jackson annotations ignored after deployment to JBOSS
该应用程序的结构为3个maven模块 - war,ejb(jar)&耳塞。
我将重构代码以从JPA实体中删除注释,但实际上找到一个连贯的解决方案会很好,因为还有其他几个应用程序需要迁移。
<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"/>
答案 0 :(得分:1)
我已经将这个(通过IDE调试器和添加日志记录)跟踪到用于war模块和ejb jar模块的不同类加载器。根据文档,这是JBoss AS 7的预期默认行为。战争使用 war ModuleLoader,ejb jar使用 ear ModuleLoader。
注释的Class会根据哪个类加载器加载注释而有所不同。另请参阅:similar issue on SO
“不同”我的意思是它们是相同的注释,来源于同一个罐子&amp;版本,但根据equals的合同,它们不等同,它们的哈希码不同,因此 JacksonAnnotationIntrospector 没有找到注释,即使它们显示为对JPA POJO类持有。
我已经解决了这个问题,因为使得ModuleLoader成为jackson 2的常用加载器。我通过提供 com.fasterxml.jackson.core数据绑定依赖来实现此目的。 >战争范围&amp; ejb jar,并将其标记为耳朵POM中的正常编译范围依赖项。
虽然它使用 jboss-deployment-structure 或MANIFEST.MF来实现几乎相同的东西,但这种方法在此JBoss AS classloading得到了认可。