스프링

 

 

EventController

 

 

@Controller
@RequestMapping(value = "/api/events", produces = MediaTypes.HAL_JSON_VALUE)
@RequiredArgsConstructor
@Log4j2
public class EventController {  


  @PostMapping
    public ResponseEntity createEvent(@RequestBody @Valid  EventDto eventDto, Errors errors){
        if(errors.hasErrors()){
            return ResponseEntity.badRequest().body(errors);
        }

        //커스텀 validate 검사
        eventValidator.validate(eventDto, errors);
        if(errors.hasErrors()){
            return ResponseEntity.badRequest().body(errors);
        }

        //modelMapper 오류
        //Event event=modelMapper.map(eventDto, Event.class);
        Event event = eventDto.toEvent();
        Integer eventId = event.getId();
        //유료인지 무료인지 변경처리
        event.update();
        Event newEvent=this.eventRepository.save(event);//저장

        /**
         *
         * ★ 링크 생성하기
         * EntityModel.of(newEvent); Resource 객체를 가져와서 사용
         *
         * **/
        WebMvcLinkBuilder selfLinkBuilder = linkTo(EventController.class).slash(eventId);
        URI createdUri = selfLinkBuilder.toUri();

        EntityModel eventResource = EntityModel.of(newEvent);
        eventResource.add(linkTo(EventController.class).slash(eventId).withSelfRel());
        eventResource.add(linkTo(EventController.class).withRel("query-events"));
        eventResource.add(selfLinkBuilder.withRel("update-event"));
        return ResponseEntity.created(createdUri).body(eventResource);
    }

 

EventControllerTests

  @SpringBootTest
@AutoConfigureMockMvc
public class EventControllerTests {

    @Autowired
    MockMvc mockMvc;

    @Autowired
    ObjectMapper objectMapper;


 @Test
    @DisplayName("정상적으로 이벤트를 생성하는 테스트")
    public void createEvent() throws  Exception{
        Event event =Event.builder()
                .id(100)
                .name("Spring")
                .description("REST API Development with Spring")
                .beginEnrollmentDateTime(LocalDateTime.of(2023, 05,  06, 19 , 20 ))
                .closeEnrollmentDateTime(LocalDateTime.of(2023, 05,  20,  20 , 20))
                .beginEventDateTime(LocalDateTime.of(2023, 05, 20, 20, 20))
                .endEventDateTime(LocalDateTime.of(2023, 11, 26,  20, 20))
                .basePrice(100)
                .maxPrice(200)
                .limitOfEnrollment(100)
                .location("강남역 D2 스타텀 팩토리")
                .free(false)
                .offline(false)
                .eventStatus(EventStatus.DRAFT)
                .build();

        mockMvc.perform(
                        post("/api/events")
                                .contentType(MediaType.APPLICATION_JSON_UTF8)
                                .accept(MediaTypes.HAL_JSON)
                                .content(objectMapper.writeValueAsString(event))
                )
                .andDo(print())
                .andExpect(status().isCreated())
                .andExpect(jsonPath("id").exists())
                .andExpect(header().exists(HttpHeaders.LOCATION))
                .andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaTypes.HAL_JSON_VALUE))

                //.andExpect(header().string(HttpHeaders.CONTENT_TYPE, "application/hal+json;charset=UTF-8"))

                .andExpect(jsonPath("free").value(false))
                .andExpect(jsonPath("offline").value(true))
               // .andExpect(jsonPath("eventStatus").value(EventStatus.DRAFT.toString()))
                .andExpect(jsonPath("_links.self").exists())
                .andExpect(jsonPath("_links.query-events").exists())
                .andExpect(jsonPath("_links.update-event").exists());
    }

 

다음과 같이 한글 깨짐 출력이 나타나는데

{
"id":1,
"name":"Spring",
"description":"REST API Development with Spring",
"beginEnrollmentDateTime":"2023-05-06T19:20:00",
"closeEnrollmentDateTime":"2023-05-20T20:20:00",
"beginEventDateTime":"2023-05-20T20:20:00",
"endEventDateTime":"2023-11-26T20:20:00",
"location":"강남역 D2 스타텀 íŒ©í† ë¦¬",
"basePrice":100,
"maxPrice":200,
"limitOfEnrollment":100,
"offline":true,
"free":false,
"eventStatus":null,
"_links":{
"self":{
"href":"http://localhost/api/events"
},
"query-events":{
"href":"http://localhost/api/events"
},
"update-event":{
"href":"http://localhost/api/events"
}
}
}

 

 

 

다음을 참조해서 설정 변경

http://honeymon.io/tech/2019/10/23/spring-deprecated-media-type.html

 

그러나, 이해가 안되면 다음과 같이 

 

application.properties에 설정 추가

 

# UTF-8 세팅
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.force=true

 

 

테스트 설정

   .andExpect(header().string(HttpHeaders.CONTENT_TYPE, "application/hal+json;charset=UTF-8"))

 

 

{참
"id":1,
"name":"Spring",
"description":"REST API Development with Spring",
"beginEnrollmentDateTime":"2023-05-06T19:20:00",
"closeEnrollmentDateTime":"2023-05-20T20:20:00",
"beginEventDateTime":"2023-05-20T20:20:00",
"endEventDateTime":"2023-11-26T20:20:00",
"location":"강남역 D2 스타텀 팩토리",
"basePrice":100,
"maxPrice":200,
"limitOfEnrollment":100,
"offline":true,
"free":false,
"eventStatus":null,
"_links":{
"self":{
"href":"http://localhost/api/events"
},
"query-events":{
"href":"http://localhost/api/events"
},
"update-event":{
"href":"http://localhost/api/events"
}
}
}

 

 

 

참조 :

https://smpark1020.tistory.com/169

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

어린 시절의 이상주의 가운데에서 인간의 진리가 발견될 수 있으며, 어린 시절의 이상주의야말로 이 세상의 아무 것과도 바꿀 수 없는 인간의 부(富)이다. -슈바이처

댓글 ( 4)

댓글 남기기

작성