【问题标题】:How do I get Wildfly to use additional Jackson Datatypes?如何让 Wildfly 使用其他 Jackson 数据类型?
【发布时间】:2014-04-03 06:47:56
【问题描述】:

我收到了这个错误

03:33:14,938 WARN  [org.jboss.resteasy.core.ExceptionHandler] (default task-1) Failed executing PUT /individual/5a247ce9-0a73-4373-89ce-e4177f911259/activities/432e6e5b-4185-462f-b57e-9ec04bec3d58: org.jboss.resteasy.spi.ReaderException: org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [simple type, class java.time.Instant] from JSON String; no single-String constructor/factory method (through reference chain: com.lm.activity.DTOActivity["created"])

这是因为 Wildfly 不知道如何处理瞬间。通过阅读错误,我可以简单地在该课程中处理它,但这似乎很愚蠢。我正在使用以下库,并在我的war 文件中发送它和所有更新的杰克逊,但仅此一项并没有这样做。

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.3.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.3.2</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>2.3.2</version>
    </dependency>

我找到this wiki

但是我的实现有问题,类定义语句有错误

package com.lm.infrastructure;

import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

@Provider
@Produces( MediaType.APPLICATION_JSON )
public class JacksonProducer implements ContextResolver<ObjectMapper> {

    public JacksonProducer() throws Exception {
        this.json = new ObjectMapper()
                .findAndRegisterModules()
                .configure( FAIL_ON_UNKNOWN_PROPERTIES, false );

    }

    @Override
    public ObjectMapper getContext( Class<?> type ) {
        return json;
    }
    private final ObjectMapper json;
}

我把它放在我的web.xml 中(不要与jboss-web.xml 混淆)

<web-app ...
  <context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>com.lm.infrastructure.JacksonProducer</param-value>
  </context-param>
</web-app>

我尝试修改modules/system/layers/base/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/main/module.xml,这似乎是建议here

 <module xmlns="urn:jboss:module:1.1" name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider">
 <resources>
    <resource-root path="jackson-jaxrs-json-provider-2.3.2.jar"/>
    <resource-root path="jackson-jaxrs-base-2.3.2.jar"/>
    <resource-root path="jackson-module-jaxb-annotations-2.3.2.jar"/>
    <resource-root path="jackson-databind-2.3.2.jar"/>
    <resource-root path="jackson-datatype-jsr310-2.3.2.jar"/>
    <!-- Insert resources here -->
</resources>

<dependencies>
    <module name="javax.api"/>
    <module name="javax.ws.rs.api"/>
    <module name="javax.xml.bind.api"/>
    <module name="com.fasterxml.jackson.core.jackson-annotations"/>
    <module name="com.fasterxml.jackson.core.jackson-core"/>
    <module name="com.fasterxml.jackson.core.jackson-databind"/>
    <module name="com.fasterxml.jackson.datatype.jackson-datatype-jsr310"/>
</dependencies>
</module>

我的主要目标是让 jsr310 序列化和反序列化。我需要做什么才能做到这一点?但我怀疑答案将适用于 Wildfly 不附带的任何其他数据类型。 (我认为this issue 是相关的)

【问题讨论】:

  • 您使用的是 Java 8 吗?
  • 看来你应该直接要求 Wildfly 支持 JSR-310
  • @JodaStephen 我高度怀疑这不是真的......我认为这只是加载和配置东西的问题,而现在还没有这样做。

标签: java jackson wildfly java-time


【解决方案1】:

WildFly 10

为了让额外的数据类型在 WildFly 10 下工作,我还创建了一个文件 jboss-deployment-structure.xml,但包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
  <deployment>
    <dependencies>
      <module name="com.fasterxml.jackson.datatype.jackson-datatype-jsr310" services="import" />
      <module name="com.fasterxml.jackson.datatype.jackson-datatype-jdk8" services="import" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>

这让我可以使用 Jdk8ModuleJavaTimeModule 类。

【讨论】:

    【解决方案2】:

    最终我受到了This Bug in 8.0.0.Final 的影响,它应该在 8.0.1 中修复,在那之前我已经降级到 8.0.0.CR1。

    这是我的最终结果pom.xml,请注意我使用的是 2.2.3

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.2.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.2.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.2.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>2.2.3-beta5</version>
        </dependency>
    

    我的web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
     ...
        <context-param>
            <param-name>resteasy.providers</param-name>
            <param-value>com.lm.infrastructure.JacksonProducer</param-value>
        </context-param>
    </web-app>
    

    我的jboss-deployment-structure.xml这是必需的,我之前没有

    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
            <deployment>
                    <exclusions>
                            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
                            <module name="org.jboss.resteasy.resteasy-jettison-provider" />
                    </exclusions>
                    <dependencies>
                            <module name="org.jboss.resteasy.resteasy-jackson2-provider" services="import" />
                    </dependencies>
            </deployment>
    </jboss-deployment-structure>
    

    我的制作人

    package com.lm.infrastructure;
    
    import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import static com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.ext.ContextResolver;
    import javax.ws.rs.ext.Provider;
    
    @Provider
    @Produces( MediaType.APPLICATION_JSON )
    public class JacksonProducer implements ContextResolver<ObjectMapper> {
    
        public JacksonProducer() throws Exception {
            this.json
                = new ObjectMapper()
                .findAndRegisterModules()
                .configure( WRITE_DATES_AS_TIMESTAMPS, false )
                .configure( FAIL_ON_UNKNOWN_PROPERTIES, false );
        }
    
        @Override
        public ObjectMapper getContext( Class<?> objectType ) {
            return json;
        }
    
        private final ObjectMapper json;
    }
    

    最后但并非最不重要的是我的 arquillian 战争一代

    public static WebArchive testWar() {
        File[] libs
                = Maven.resolver().loadPomFromFile( "pom.xml" )
                .resolve(
                        "com.fasterxml.jackson.datatype:jackson-datatype-jsr310"
                )
                .withTransitivity()
                .asFile();
    
        return ShrinkWrap.create( WebArchive.class )
                .setWebXML( new File( "src/main/webapp/WEB-INF/web.xml" ) )
                .addAsWebInfResource( new File( "src/main/webapp/WEB-INF/jboss-web.xml" ) )
                .addAsWebInfResource( new File( "src/main/resources/logback.xml" ) )
                .addAsWebInfResource( new File( "src/main/webapp/WEB-INF/jboss-deployment-structure.xml" ) )
                .addAsWebInfResource( EmptyAsset.INSTANCE, "beans.xml" )
                .addPackages( false, Filters.exclude( ".*Test.*" ), getCorePackages() )
                .addAsLibraries( libs );
    }
    

    【讨论】:

    • 请注意,web.xml 和 jboss-deployment.xml 不是为了让它工作而需要的(否则你可能需要它们)。
    猜你喜欢
    • 1970-01-01
    • 2016-08-19
    • 2020-07-14
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多