2017-09-13 23 views
2

私は休止状態の春休憩APIを開発しようとしています。 Googleで検索した後、遅延読み込みの解決策が見つかりませんでした。 、残りのAPIを呼び出した後春休み休止状態での遅延ロード

University.java

@Entity() 
@Table(schema = "core", name = "university") 
public class University extends BaseEntity { 

    private String uniName; 
    private String uniTelephon; 


    @LazyCollection(LazyCollectionOption.FALSE) 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "university", cascade = CascadeType.ALL) 
    @JsonManagedReference 
    private List<Student> students; 

//setter and getter 
} 

Student.java

@Entity 
@Table(schema = "core",name = "student") 
public class Student { 

    @Id 
    @GeneratedValue    
    private long id;   

    private String firstName;   

    private String lastName;   

    private String section; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name = "UNIVERSITY_ID",nullable = false) 
    @JsonBackReference 
    private University university; 
    // setter and getter 
} 

でも私の残りのエンドポイント

@GetMapping("/list") 
public ResponseEntity list() throws Exception { 
    // I need to return just Universities But it return it eagerly with their students 
    return new ResponseEntity(this.universityService.findAll(), HttpStatus.OK); 
} 

: は、私は2つのエンティティ以下のように持っていますそれはすべての学生と大学を返します。

未取得のオブジェクトまたはコレクションをシリアル化しないようにJacksonに指示する方法がありますか?

誰かが証明されたソリューションで私を助けることができますか?その後、

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-hibernate5</artifactId> 
    <version>${jackson.version}</version> 
</dependency> 

そしてWebMvcConfigurerAdapterクラスに以下を追加します(あなたは、Javaベースの構成を持っていると仮定します)::

答えて

3

(あなたの休止状態のバージョンによって異なります)、次の依存を追加してみてください

@Override 
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
    converters.add(jackson2HttpMessageConverter()); 
} 

@Bean 
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() { 
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
    converter.setObjectMapper(this.jacksonBuilder().build()); 

    return converter; 
} 

public Jackson2ObjectMapperBuilder jacksonBuilder() { 
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 

    Hibernate5Module hibernateModule = new Hibernate5Module(); 

    hibernateModule.configure(Feature.FORCE_LAZY_LOADING, false); 

    builder.modules(hibernateModule); 

    // Spring MVC default Objectmapper configuration 
    builder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 
    builder.featuresToDisable(MapperFeature.DEFAULT_VIEW_INCLUSION); 

    return builder; 
} 

JacksonのobjectMapperに遅延ロードされた値をフェッチさせないようにする必要があります。

+0

HTTPステータス500 - コンテンツを書き込めませんでした:ロールのコレクションを遅延して初期化できませんでした:a2.asena.cashModel.University.students、プロキシを初期化できませんでした。 util.ArrayList [0] - > a2.asena.cashModel.University ["students"]);ネストされた例外はcom.fasterxml.jackson.databind.JsonMappingExceptionです:ロールのコレクションを遅延して初期化できませんでした:a2.asena.cashModel.University.students、プロキシを初期化できませんでした - セッションなし(参照チェーンを通じて:java.util.ArrayList [上記の例外ソリューションの – Generic

+0

は、Appinitializerのフィルタオーバーライド プロテクトFilter [] getServletFilters(){ return new filter [] {new {新しいMultipartFilter()、新しいOpenEntityManagerInViewFilter()}; – Generic

+0

いくつかの記事はそれが適切な解決策ではないと言っています – Generic