Jacksonを使って非常に単純なオブジェクトを直列化しようとすると例外が発生します。エラー:
org.codehaus.jackson.map.JsonMappingException:MyPackage.TestAクラスのシリアライザが見つかりませんでした。また、BeanSerializerを作成するためのプロパティが見つかりませんでした(例外を回避するには、SerializationConfig.Feature.FAIL_ON_EMPTY_BEANSを無効にしてください)。
以下は直列化する単純なクラスとコードです。
誰が私がこのエラーを受け取る理由を私に言うことができますか?
public class TestA {
String SomeString = "asd";
}
TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
String testAString = om.writeValueAsString(testA); // error here!
TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
既に説明したように、ObjectMapper
インスタンスのデフォルト設定は、パブリックフィールドであるかパブリックなgetter/setterを持つプロパティにのみアクセスすることです。フィールドをパブリックにするかパブリックのgetter/setterを提供するようにクラス定義を変更する代わりに、(基礎となるVisibilityChecker
に)別のプロパティ可視性ルールを指定することもできます。 Jackson 1.9はそのための便利なObjectMapper.setVisibility()
メソッドを提供しています。元の質問の例では、これを次のように設定します。
myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
Jackson> 2.0の場合:
myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
関連する設定オプションの詳細と詳細については、 ObjectMapper.setVisibility()
のJavaDocsを確認することをお勧めします。
Jacksonがそのクラスをシリアライズするには、SomeString
フィールドはpublic
である必要があります(現在はパッケージレベルの分離です)か、それにgetterメソッドとsetterメソッドを定義する必要があります。
私のソースコードにも同じ問題があります。追加しました
ゲッター
そして
セッター
問題は解決しました。
私の場合の問題は、Jacksonが属性もメソッドもない空のオブジェクトを直列化しようとしていたことです。
例外で示唆されているように、空のBeanで失敗しないように次の行を追加しました。
ジャクソン1.9用
myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
Jackson 2.Xの場合
myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
単純な例は jackson disable fail_on_empty_beans にあります。
私はコントロールを持っていた子クラスについても同じ問題を抱えていました。オブジェクトマッパーは共通のモジュールの中にあり、アクセスできませんでした。オブジェクトがシリアル化されることになっていた私の子クラスにこのアノテーションを追加することによってそれを解決しました。
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
そのオブジェクトを含むクラスを編集できるのであれば、通常は注釈を追加するだけです。
import com.fasterxml.jackson.annotation.JsonIgnore;
@JsonIgnore
NonSerializeableClass obj;
このエラーは、戻りステータスに.build()メソッドを追加し忘れた場合にもスローされます。
return Response.status(Status.OK); // fails
return Response.status(Status.OK).build(); // works
Build()メソッドなしで以下のエラーが出ました。
org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.Sun.jersey.core.spi.factory.ResponseBuilderImpl
変数がprivate
として宣言されているために問題がある可能性があります。これをpublic
に変更すれば、うまくいきます。
より良い方法は、getterメソッドとsetterメソッドを使うことです。
これで問題は解決します。
Oracle Javaアプリケーションの場合は、ObjectMapper
インスタンス化の後にこれを追加します。
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
これが3つのオプションです。
public
である必要がありますpublic
でなければ、ゲッターとセッターを追加する@JsonIgnore("context")
を追加私はこれを行う少なくとも3つの方法を見つけました:
public getters
を追加します。public getters
が不要な場合は、エンティティの最上部に注釈を追加します。これにより、JacksonのデフォルトがVisbility=DEFAULT
から@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
に変更されます。objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
を設定してObjectMapper
をグローバルに変更してください。この機能をグローバルに必要としないのであれば、これは避けるべきです。あなたのニーズに基づいて選択してください。
私は休止状態のプロキシオブジェクトを介した遅延ロードに関しても同様の問題を抱えていました。遅延ロードされたプライベートプロパティを持つクラスに次のようにアノテーションを付けることによってそれを回避しました:
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
SpringBoot2.0、以下のコードで解決しています:
@Bean public ObjectMapper objectMapper() {
return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}
ゲッターとセッターを追加しましたが、同じエラーが発生しました。後で私はバグを見つけました、それは私が問題を引き起こしていた保護としてゲッターとセッターをcgahngedしたSonarのアドバイスによるものです。私はそれが期待どおりに働いたことを修正したら。