2015-01-27 110 views
1

我有以下類:當MongoDB的DBREF lazyness設置爲true,java.lang.IllegalArgumentException異常是拋

@Document(collection = "T_FOO") 
public class Foo implements Serializable { 

    @Field 
    private String name; 

    @Field 
    private String observations; 

    @DBRef 
    @Field 
    private Foo[] parents; 

} 

在這個測試,成功:

@Test 
    public void testFooWithParents() throws Exception { 
     //mock User 
     User user = new User(); user.setLogin("admin"); 
     when(userService.getUserWithAuthorities()).thenReturn(user); 

     // Create Father 
     restFooMockMvc.perform(post("/app/rest/foos") 
       .contentType(TestUtil.APPLICATION_JSON_UTF8) 
       .content(TestUtil.convertObjectToJson(fooFather))) 
       .andExpect(status().isOk()); 
     // Create Mother 
     restFooMockMvc.perform(post("/app/rest/foos") 
       .contentType(TestUtil.APPLICATION_JSON_UTF8) 
       .content(TestUtil.convertObjectToJson(fooMother))) 
       .andExpect(status().isOk()); 

     foo.setParents(new Foo[]{fooFather, fooMother}); 

     // Create Foo 
     restFooMockMvc.perform(post("/app/rest/foos") 
       .contentType(TestUtil.APPLICATION_JSON_UTF8) 
       .content(TestUtil.convertObjectToJson(foo))) 
       .andExpect(status().isOk()); 

     // Read Foo 
     MvcResult result = restFooMockMvc.perform(get("/app/rest/foos/{id}", DEFAULT_ID)) 
       .andExpect(status().isOk()) 
       .andExpect(content().contentType(MediaType.APPLICATION_JSON)) 
       .andExpect(jsonPath("$.id").value(DEFAULT_ID)) 
       .andExpect(jsonPath("$.name").value(DEFAULT_NAME.toString())) 
       .andExpect(jsonPath("$.observations").value(DEFAULT_OBSERVATIONS)) 
       .andExpect(jsonPath("$.parents[0].id").value(FATHER_ID)) 
       .andExpect(jsonPath("$.parents[1].id").value(MOTHER_ID)) 
       .andReturn(); 

     String content = result.getResponse().getContentAsString(); 
    } 

當我設置了家長陣列爲lazy = true,我得到這個例外:

org.springframework.web.util.NestedServletException: 
Request processing failed; nested exception is java.lang.IllegalArgumentException: 
Cannot subclass final class class [Lorg.domain.Foo; 

這是拋出的時刻我請求Foo兒子(「閱讀Foo」)。 Spring發生了什麼事情無法再重新構建對象?

最好的, 佩德羅。

回答

4

延遲加載Spring數據中的Db-Refs僅當屬性的類型是非最終類或接口時才支持MongoDB,因爲我們需要能夠爲它創建JDK或CGLib代理。數組不支持。我創建了https://jira.spring.io/browse/DATAMONGO-1157來跟蹤這個。

+0

謝謝您的反饋和錯誤托馬斯。我現在無法測試,但如果我替換爲'List '我的陣列,它應該可以工作嗎? –

+0

是使用集合類/接口應該工作。 –

+0

我確實。謝謝您的幫助! –

相關問題