2013-10-26 3 views
3

Это мой контроллер:400 Bad Request Spring Test Web Application

@RequestMapping(value = "/followers", method = RequestMethod.POST, consumes = "application/json" , produces = "application/json") 
@ResponseBody 
public Follower create(@RequestBody Follower follower, HttpServletResponse response) { 
    Follower savedFollower = service.create(follower); 
    response.setStatus(201); //Created 
    return savedfollower; 

} 

И это мой тест:

@Test 
public void post_should_create_new_follower() throws Exception { 
    Follower follower = new FollowerDummyBuilder().build(); 
    ObjectMapper objectMapper = new ObjectMapper(); 
    String asJson = objectMapper.writeValueAsString(follower); 

    assertEquals(0l, JPATestUtils.countEntity(em, Follower.class)); 
    this.mockMvc.perform(MockMvcRequestBuilders.post("/followers"). 
      accept(MediaType.APPLICATION_JSON). 
      contentType(MediaType.APPLICATION_JSON).content(asJson)).andExpect((MockMvcResultMatchers.status().isCreated())); 

    assertEquals(1l, JPATestUtils.countEntity(em, Follower.class)); 

} 

Но я всегда получаю 400 Bad Request, и я не в состоянии чтобы выяснить, почему ...

У кого-нибудь есть подсказка? Update Добавление класса Последователь

@Entity 
public class Follower extends AbstractEntity { 

    @OneToOne(cascade = CascadeType.ALL) 
    @NotNull 
    private Credentials Credentials; 

    @NotNull 
    @OneToOne(cascade = CascadeType.ALL) 
    private UserRetrievalStrategy userRetrievalStrategy; 

    @NotNull 
    @OneToOne(cascade = CascadeType.ALL) 
    private SearchEngineFilter searchEngineFilter; 


    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JsonIgnore 
    private IgnoreList ignoreList = new IgnoreList(); 

    @Enumerated(EnumType.STRING) 
    @NotNull 
    private FollowerStatus status; 



    protected Follower() { 

    } 

    public Follower(Credentials credentials, UserRetrievalStrategy userRetrievalStrategy, SearchEngineFilter searchEngineFilter) { 
     this.credentials = credentials; 
     this.userRetrievalStrategy = userRetrievalStrategy; 
     this.searchEngineFilter = searchEngineFilter; 
     this.status = FollowerStatus.STOPED; 
    } 


    public Credentials getCredentials() { 
     return credentials; 
    } 


    public void addUserToIgnoreList(User user) { 
     this.ignoreList.add(user); 
    } 

    public IgnoreList getIgnoreList() { 
     return ignoreList; 
    } 

    public UserRetrievalStrategy getUserRetrievalStrategy() { 
     return userRetrievalStrategy; 
    } 

    public SearchEngineFilter getSearchEngineFilter() { 
     return searchEngineFilter; 
    } 

    public void setSearchEngineFilter(SearchEngineFilter searchEngineFilter) { 
     this.searchEngineFilter = searchEngineFilter; 
    } 

    public Iterator<User> getIgnoreListIterator() { 
     return ignoreList.iterator(); 
    } 

    public void clearIgnoreList() { 
     this.ignoreList.clearList(); 
     this.ignoreList = new IgnoreList(); 
    } 

    public void setStaus(AutofollowerStatus status) { 
     this.status = status; 
    } 

    public AutofollowerStatus getStatus() { 
     return status; 
    } 
} 
+0

Вы можете разместить свой 'Follower' класс? –

+0

Вы пробовали распечатать 'asJson' и отправить его вручную в конечную точку REST с помощью клиентской утилиты, чтобы убедиться, что аббревиатура mock framework не мешает? Кроме того, ваша конечная точка выполняет какую-либо специальную проверку на «Follower» и вручную бросает 400, если это не удается? – Vidya

+0

Да, я печатаю его и хорошо смотрю. –

ответ

0

Нашли проблему:

public Iterator<User> getIgnoreListIterator() { 
    return ignoreList.iterator(); 
} 

Я добавил этот метод и джексон пытается сериализовать поле с именем ignoreListIterator ...

аннотирования с @JsonIgnore Решает проблема.

Update: Лучше в этом случае использовать кроме Java Bean именем свойства конвенции и изменить имя метода для:

public Iterator<User> ignoreListIterator() { 
    return ignoreList.iterator(); 
} 

Благодаря