61

ジャクソンは、修正方法がわからない奇妙な例外をスローしています。私はSpring、Hibernate、およびJacksonを使用しています。

遅延読み込みが問題の原因であると既に考えましたが、次のように Jackson にさまざまなプロパティを処理しないように指示する手段を講じました。

@JsonIgnoreProperties({ "sentMessages", "receivedMessages", "educationFacility" })
public class Director extends UserAccount implements EducationFacilityUser {
   ....
}

他のすべての UserAccount サブクラスについても同じことを行いました。

スローされる例外は次のとおりです。

org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: java.util.ArrayList[46]->jobprep.domain.educationfacility.Director_$$_javassist_2["handler"])
    at org.codehaus.jackson.map.ser.StdSerializerProvider$1.serialize(StdSerializerProvider.java:62)
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:268)
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:146)
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:118)
    at org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:236)
    at org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:189)
    at org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:111)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:296)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224)
    at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:925)
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.writeInternal(MappingJacksonHttpMessageConverter.java:153)

これを引き起こしている原因を確認するために詳細情報を取得する方法についての提案はありますか? 誰でもそれを修正する方法を知っていますか?

編集: getHander() およびその他の get*() メソッドがプロキシ オブジェクトに存在することを発見しました。ぐらっ!Jackson にプロキシで何も処理しないように指示する方法はありますか? JSON を吐き出すメソッドは、常にではなく、特定の状況でのみクラッシュするため、これは非常に奇妙です。それにもかかわらず、これはプロキシ オブジェクトの get*() メソッドによるものです。

余談: プロキシは悪です。それらは、Jackson、equals()、および通常の Java プログラミングの他の多くの部分を混乱させます。私はHibernateを完全に捨てたいと思っています:/

4

15 に答える 15

71

休止状態のプロキシ オブジェクトを介した遅延読み込みで同様の問題が発生しました。遅延ロードされたプライベート プロパティを持つクラスに次のアノテーションを付けることで回避しました。

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

JSON シリアライゼーションをそのアノテーションに分割するプロキシ オブジェクトにプロパティを追加できると思います。

フェッチされていない遅延オブジェクトでの Jackson シリアライゼーションを避ける

于 2011-01-04T07:27:49.077 に答える
38

@JsonAutoDetect理想的ではありませんが、クラスレベルで使用して、JacksonによるJSONプロパティの自動検出を無効にすることができます。これにより、Javassistのものを処理しようとする(そして失敗する)のを防ぐことができます。

これは、各ゲッターに手動で(を使用して@JsonProperty)注釈を付ける必要があることを意味しますが、それは物事を明示的に保つため、必ずしも悪いことではありません。

于 2010-12-06T00:10:59.557 に答える
23

同じエラーが発生しましたが、Hibernate とは関係ありません。ここでは、すべての恐ろしい提案から怖がっています。これは、Hibernate と遅延読み込みの場合に関連すると思います...データ...

ゲッターとセッターを追加すると問題が解決しました。

于 2011-11-21T14:26:17.290 に答える
9

価値があるのは、開始したばかりのJackson Hibernateモジュールプロジェクトがあり、この問題とうまくいけば他の問題も解決するはずです。プロジェクトは Jackson プロジェクトに関連していますが、コア ソースの一部ではありません。これは主に、リリース プロセスを簡素化するためです。Module API が導入されたときであるため、Jackson 1.7 が必要になります。

于 2010-12-07T17:06:16.473 に答える
6

私も同じ問題を抱えていました。を使用しているかどうかを確認しますhibernatesession.load()。もしそうなら、に変換してみてくださいhibernatesession.get()。これで私の問題は解決しました。

于 2012-03-29T16:45:49.013 に答える
5

spring's から同じエラー メッセージが表示されました@RestController。私の残りのコントローラークラスはSpringのクラスを使用していましたが、メソッド呼び出しをJpaRepository置き換えることで問題はなくなりました。repository.getOne(id)repository.findOne(id)

于 2014-04-25T06:27:10.647 に答える
4

jackson-datatype-hibernate モジュールを使用して、この問題を解決できます。それは私のために働く。参照: https://github.com/FasterXML/jackson-datatype-hibernate

于 2014-02-10T02:26:39.110 に答える
2

@JsonIgnoreProperties(value = { "handler", "hibernateLazyInitializer" })クラス「Director」で注釈を使用できます

于 2012-07-20T08:50:06.413 に答える
0

また、ドメイン オブジェクトを Director final にすることもできます。これは完全な解決策ではありませんが、ドメイン クラスのプロキシ サブクラスの作成を防ぎます。

于 2016-09-15T21:16:31.793 に答える
0

「org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.company.project.yourclass」を取得したとき、私はジャクソン API を初めて使用します。com.company.project.yourclass にゲッターとセッターを追加しました。 、これは ObjectMapper のマッパー オブジェクトを使用して Java オブジェクトをフラット ファイルに書き込むのに役立ちました。

于 2012-06-08T09:52:57.967 に答える
0

私は同じ問題に直面しました.同じコードがいくつかのケースで機能するのに、いくつかのランダムなケースで失敗したのは本当に奇妙です.

適切なセッター/ゲッターを確認するだけで修正されました(大文字と小文字の区別を確認してください)

于 2013-11-06T07:14:34.680 に答える
0

私は試し@JsonDetectてみました

@JsonIgnoreProperties(value = { "handler", "hibernateLazyInitializer" })

どちらも私にとってはうまくいきませんでした。サードパーティのモジュールを使用することは、私には大変な作業のように思えました。そのため、serlizationgetに渡す前に、遅延オブジェクトの任意のプロパティを呼び出してみました。jackson作業コード スニペットは次のようになります。

@RequestMapping(value = "/authenticate", produces = "application/json; charset=utf-8")
    @ResponseBody
    @Transactional
    public Account authenticate(Principal principal) {
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = (UsernamePasswordAuthenticationToken) principal;
        LoggedInUserDetails loggedInUserDetails = (LoggedInUserDetails) usernamePasswordAuthenticationToken.getPrincipal();
        User user = userRepository.findOne(loggedInUserDetails.getUserId());
        Account account = user.getAccount();
        account.getFullName();      //Since, account is lazy giving it directly to jackson for serlization didn't worked & hence, this quick-fix.
        return account;
    }
于 2015-03-12T20:36:02.717 に答える