当前位置: 首页 > 面试题库 >

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

时同
2023-03-14
问题内容

我正在将Web应用程序从Websphere 7(JEE5)迁移到JBoss EAP 6.2.0(JEE6)。目前,它在Glassfish
3和WAS中可以正常工作。

Web界面消耗/产生JSON-因此,我将使用带有Spring 3 MVC
MappingJackson2HttpMessageConverter的Jackson2 来在简单的控制器类中处理(反序列化)。

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

我尝试了所有的jboss-deployment-structure.xml更改都无济于事(请参阅下文)。我知道JBoss附带Jackson
1.x作为内部模块。但是,这似乎不是问题所在,否则Web模块注释也将被忽略吗?例如:部署到JBOSS后,将忽略Jackson注释

该应用程序由3个Maven模块组成-war,ejb(罐子)和耳箱。

我将重构代码以从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重命名来解决/解决了此问题,从而重命名/禁止了相关字段。我已经对此进行了测试,并且效果很好。

所有这些的要点是,通过使用Jackson Mixin,序列化的自定义范围已限制在Web模块中,从而避免了由于 ejb-jar
子部署而可能导致的类加载问题。没有使用 jboss-deployment-structure.xml

添加混音

public interface MyMixin {


    @JsonIgnore
    String getUnwantedField();

    @JsonProperty(value = "newName")
    String getOldName();

}

然后在启动我的Web控制器时,我将Mixin连接到Jackson ObjectMapper,后者自动连接到控制器中,并在我的调度程序html" target="_blank">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模块和ejb jar模块的不同类加载器。根据文档,这是JBoss AS 7的预期默认行为。战争使用
war ModuleLoader,而ejb jar使用 耳朵 ModuleLoader。

注释的类会发生什么,取决于哪个类加载器加载注释。另请参阅:
关于SO的类似问题

“差异”是指它们是相同的注释,来自相同的jar和版本,但是根据等价合同,它们不被视为等同,其哈希码也不同,因此即使显示为保留,
JacksonAnnotationIntrospector 也不会定位注释针对JPA POJO类。

解决方法

我已通过使Ear ModuleLoader成为jackson 2的通用加载器来解决此问题。我通过使 com.fasterxml.jackson.core
databind
依赖项在war&ejb jar中 提供了 作用域,并将其标记为常规编译作用域来解决此问题。依赖于耳朵的POM。

尽管Jboss AS类加载使用 jboss-deployment-structure
或MANIFEST.MF来实现几乎相同的目的,但在这里JBoss AS类加载还是支持这种方法。



 类似资料:
  • 我已经为这个问题挣扎了几天了,希望有人能帮上忙。 当我的应用程序尝试构建Hibernate3 SessionFactory时,我遇到以下错误: 下面是我的/WEB-INF/jboss网站。xml: Hibernate在我的单元测试中运行良好,只有当我将其部署到测试服务器时才会发生这种情况。 从我发现的情况来看,这似乎是因为jboss已经有了dom4j的副本。 不,我无法从我的项目中删除dom4j,

  • 问题内容: 我有一个使用两个杰克逊注释的类: 在测试用例中,当我使用ObjectMapper来将接收到的JSON映射到MyObject本地环境时,它可以正常工作,但是,如果将模块部署到JBOSS AS中,所有注释都将被忽略,我不知道为什么。 我pom.xml有依赖性: 因此,该库将导入到部署中的WAR文件夹中。 为什么在部署后请忽略注释? 问题答案: 问题在于由于自动导入了较旧版本的Jackson

  • 问题内容: 我有一个实体,该实体与另一个用@Where注释的实体有关联,就像这样 最近不可避免的事情发生了,我需要加载不符合@Where子句的EntityB。我可以删除@Where批注,但是它使用很多,所以理想情况下,我不想这样做。除了手动加载EntityB列表之外,还有另一个查询,我还有哪些选择?我可以告诉Hibernate忽略@Where注释吗? 问题答案: 经过大量研究,这似乎是不可能的。我

  • 我有一个SBT/Scala项目,该项目包含其依赖项“ch.qos.logback”%“logback-classic”%“1.0.13”,并包含一个logback.xml文件,其内容如下: 当我运行该程序时,得到的输出如下: ... 我启用了logback配置调试,这样您就可以看到logback声称将该类的loglevel设置为ERROR。但仍然记录了这些消息。

  • null 但是,在完成while循环之后,被完全忽略。我已经用调试器检查了字符串中的数据,它是正确的!没有错误,没有例外。

  • 运行Wildfly16,我在应用程序的WEB-INF/jboss-web.xml中指定一个安全域,如下所示: 在Wildfly的standalone.xml中,我将该安全域指定为应用程序安全域,如下所示: 当然,随后还定义了OAuth2Realm,并且Wildfly毫无怨言地启动。但是,当通过http访问应用程序时,Wildfly总是在legacy security部分使用安全域“Other”,而