fastcampus-eatgo
fastcampus-eatgo copied to clipboard
@PostMapping에서 restaurant 객체의 id값 삭제 시, header에 null값이 들어갑니다.
안녕하세요. 아샬님
멘티 정구현 입니다.
spring boot 강의 잘 보고 있습니다.
강의에서 나오는 코드를 직접 따라해보며 공부를 하고 있는데요, 16강 JPA에서 Restaurant과 MenuItem의 id에 @GeneratedValue를 추가하고, RestaurantController에서 @PostMapping에 있는 restaurant 객체에 있는 id 값을 삭제하였더니 header에 null값이 들어갔다고 Test 오류가 나옵니다.
Response header 'location' expected:</restaurants/1234> but was:</restaurants/null>
Expected :/restaurants/1234
Actual :/restaurants/null
아래에는 현재까지 진행한 실습의 RestaurantController에 있는 @PostMapping 코딩과 RestaurantCotrollerTest에 있는 create 메소드 코딩 입니다.
RestaurantController의 @PostMapping 코드
@PostMapping("/restaurants")
public ResponseEntity<?> create(@RequestBody Restaurant resource) throws SyntaxException {
String name = resource.getName();
String address = resource.getAddress();
Restaurant restaurant = new Restaurant(name, address);
restaurantService.addRestaurant(restaurant);
URI location = new URI("/restaurants/" + restaurant.getId());
return ResponseEntity.created(location).body("{}");
}
RestaurantControllerTest의 create 코드
@Test
public void create() throws Exception {
given(restaurantService.addRestaurant(any())).will(invocation -> {
Restaurant restaurant = invocation.getArgument(0);
return new Restaurant(1234L, restaurant.getName(),
restaurant.getAddress());
});
mvc.perform(post("/restaurants")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"name\":\"Beryong\",\"address\":\"Busan\"}"))
.andExpect(status().isCreated())
.andExpect(header().string("location", "/restaurants/1234"))
.andExpect(content().string("{}"));
verify(restaurantService).addRestaurant(any());
}
restaurant 객체에 id값 1234L
을 추가하고 Test를 실행하면 오류가 없어집니다.
그런데 이렇게 했을 경우 terminal
에서 httpie
를 이용하여 POST
시 header
에 restaurants/1234
가 나타나더군요...
오류를 해결하기 위해 구글 검색으로도 방법을 찾지 못해 이렇게 질문 드립니다.
감사합니다.
적어주신 코드는 모두 맞는 것 같습니다.
restaurant 객체에 id값
1234L
을 추가하고 Test를 실행하면 오류가 없어집니다.
이 부분은 어떤 의미인가요? 어딘가에서 강제로 1234L
을 써주고 있다면 문제가 됩니다.
나머지는 그대로 놔두고 RestaurantService
쪽을 확인해 보세요. https://github.com/ahastudio/fastcampus-eatgo/blob/master/eatgo-admin-api/src/main/java/kr/co/fastcampus/eatgo/application/RestaurantService.java
20강 Lombok 실습 중에 코딩을 수정하니 다시 Test 통과가 나오네요...
이 오류때문에 며칠을 아무것도 못하고 방법을 찾다가 시간만 잡아먹은것 같습니다.
오류를 찾기위해 18강 가게 수정부터 따로 카피해 놓은 eat-go
코딩파일 여러개 만들어 여러번 수정과 Test를 지웠다 다시 하고를 반복했습니다.
사실 오류를 무시하고 진행을 하고 싶었는데, 22강 에러 처리 강의 후, POST가 되지 않는 상황까지 가게되어 어쩔수 없이 오류를 찾아내야 했습니다.
혹시 제 깃헙에 강의가 끝나고 관련된 코딩 파일을 올려도 될까요?
Test 통과가 안되면 어디가 원인인지 하나하나 찾기가 어려워 강의 후 깃헙에 올려진 코드를 보면 좀 쉽게 찾을 수 있을거 같아서요.
제가 만든 코드가 아니니 여쭤보고 올리는게 맞는거 같아 이렇게 댓글 남깁니다.
조언 감사합니다.
초기부터 자기 저장소에 코드를 올리는 건 매우 좋습니다. :+1:
문제가 생길 때 바로 알려주시면 제가 도움을 드리기 더 수월할 것 같습니다.
감사합니다!!
저도 16강에서 1234L
값을 뺀 후 동일한 증상이 있어서 그 강의 앞뒤로 3~4번 보면서 찾아본 결과
18강 04분 22초
RestaurantController
의 create()
메소드를 보면
Restaurant restaurant = restaurantService.addRestaurant(
new Restaurant(name, address));
이렇게 바뀌어 있습니다.
동일하게 변경하여 주니 테스트 성공하네요..T^T