Как заставить Wildfly использовать дополнительные типы данных Jackson?
Я получаю эту ошибку
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 не знает, как обрабатывать мгновение. Прочитав ошибку, я мог бы просто справиться с ней в этом классе, но это кажется глупым. Я использую следующую библиотеку и отправляю ее и все обновленное jackson в моем 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>
нашел Вики
но моя реализация проблематична, оператор определения класса имеет ошибка
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
который, кажется, предложил здесь
<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. (Я думаю этот вопрос это связано )
2 ответов
в конечном счете я был затронут эта ошибка в 8.0.0.Финал он должен быть исправлен в 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 );
}
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>
это позволило мне использовать классы Jdk8Module
и JavaTimeModule
.