JAXBアノテーションクラスのインスタンスをJSONにエンコードする方法

JAXBアノテーションクラスのインスタンスをJSONにエンコードするには、ObjectMapper#setAnnotationIntrospector(AnnotationIntrospector)を使ってJaxbAnnotationIntrospectorを指定する。

少しハマったのでメモ。

tObjectMapper = new ObjectMapper();
 
// JAXBアノテーション解析を有効にする
tObjectMapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector());
 
// シリアライズ・デシリアライズの設定 (フィールドのみ対象とする)
tObjectMapper.configure(SerializationConfig.Feature.AUTO_DETECT_FIELDS, true);
tObjectMapper.configure(SerializationConfig.Feature.AUTO_DETECT_GETTERS, false);
tObjectMapper.configure(SerializationConfig.Feature.AUTO_DETECT_IS_GETTERS, false);
tObjectMapper.configure(DeserializationConfig.Feature.AUTO_DETECT_FIELDS, true);
tObjectMapper.configure(DeserializationConfig.Feature.AUTO_DETECT_SETTERS, false);
tObjectMapper.configure(DeserializationConfig.Feature.AUTO_DETECT_CREATORS, false);
// デシリアライズ時に未知のプロパティを見つけても無視
tObjectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 
// ファイルに書きこむ
tObjectMapper.writeValue(new File("test.json"), new JaxbAnnotatedClass());

以下のようにSerializationConfig#withAnnotationIntrospector(AnnotationIntrospector)を設定してもJAXBアノテーションクラスを解析できず、下の例外が発生するので注意。

tObjectMapper.getSerializationConfig().withAnnotationIntrospector(new JaxbAnnotationIntrospector())

JAXBアノテーションクラスを解析できずプロパティが見つからない場合の例外

org.codehaus.jackson.map.JsonMappingException: No serializer found for class JaxbAnnotatedClass and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) )
  at org.codehaus.jackson.map.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:52) ~[jackson-mapper-asl-1.9.0.jar:1.9.0]
  at org.codehaus.jackson.map.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:25) ~[jackson-mapper-asl-1.9.0.jar:1.9.0]
  at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:610) ~[jackson-mapper-asl-1.9.0.jar:1.9.0]
  at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256) ~[jackson-mapper-asl-1.9.0.jar:1.9.0]
  at org.codehaus.jackson.map.ObjectMapper._configAndWriteValue(ObjectMapper.java:2566) ~[jackson-mapper-asl-1.9.0.jar:1.9.0]
  at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:2072) ~[jackson-mapper-asl-1.9.0.jar:1.9.0]
  ... 6 common frames omitted

コメントをどうぞ