次のメソッドでセッションBeanを取得しました。
@POST
@Consumes("application/x-www-form-urlencoded")
@Path("/calculate")
@Produces("application/json")
public CalculationResult calculate(@FormParam("childProfile") String childProfile,
@FormParam("parentProfile") String parentProfile) {
...
}
返されたCalculationResultはJSONにマップできず、次の例外が発生します。
Caused by: com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class com.test.UniqueName and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)...
WildflyでジャクソンとそのSerializationFeature
を設定するにはどうすればよいですか?
「WildflyでJacksonとそのSerializationFeatureを設定するにはどうすればよいですか?」
Wildflyで構成する必要はありません。JAX-RSアプリケーションで構成できます。 ContextResolver
を使用してObjectMapper
を構成するだけです(詳細は こちら を参照)。何かのようなもの
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
Jackson依存関係をまだ持っていない場合は、コンパイル時の依存関係と同様に、それが必要です。
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>3.0.8.Final</version>
<scope>provided</scope>
</dependency>
スキャンを使用してリソースクラスとプロバイダークラスを検出している場合、ContextResolver
は自動的に検出されます。すべてのリソースとプロバイダーを明示的に登録する場合は、これも登録する必要があります。シングルトンとして登録する必要があります。
@KozProvがコメントで言及しているように、これは実際にはMaven依存関係のArtifactIdとしてresteasy-jackson2-provider
である必要があります。 -jackson-
は古いorg.codehaus
(Jackson 1.x)を使用し、-jackson2-
は新しいcom.fasterxml
(Jackson 2.x)を使用します。 Wildflyはデフォルトでジャクソン2バージョンを使用します。
ワイルドフライ9
pom.xml
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>3.0.8.Final</version>
<scope>provided</scope>
</dependency>
Javaクラス
@com.fasterxml.jackson.annotation.JsonIgnoreProperties(ignoreUnknown = true)
public class SomePojo implements Serializable {
}