Spring/스프링 기반 REST API 개발
[스프링 기반 REST API 개발] API Index Handler, ErrorsResource 추가하기
주멘이
2021. 1. 6. 23:19
Index Handler는 다른 리소스에 대한 링크를 제공한다.(EventController 및 문서화)
@RestController
public class IndexController {
@GetMapping("/api")
public RepresentationModel index() {
RepresentationModel index = new RepresentationModel();
index.add(linkTo(EventController.class).withRel("events"));
return index;
}
}
ErrorResource 작성 : 에러 발생 시 Index 링크 제공
public class ErrorsResource extends EntityModel<Errors> {
public ErrorsResource(Errors errors, Link... links) {
super(errors, links);
add(linkTo(methodOn(IndexController.class).index()).withRel("index"));
}
}
EventController 수정하기 (리팩토링)
@PostMapping
public ResponseEntity createEvent(@RequestBody @Valid EventDto eventDto, Errors errors) {
if (errors.hasErrors()) {
return badRequest(errors);
}
eventValidator.validate(eventDto, errors);
if (errors.hasErrors()) {
return badRequest(errors); // errors는 java bean spec을 준수한 것이 아니라, serialize 불가 --> ErrorsSerializer를 objectMapper에 등록해주면, json으로 받을 수 있다
}
Event event = modelMapper.map(eventDto, Event.class);
event.update();
Event newEvent = this.eventRepository.save(event);
WebMvcLinkBuilder selfLinkBuilder = linkTo(EventController.class).slash(newEvent.getId());
URI createdUri = selfLinkBuilder.toUri();
/* HATEOAS links add */
EventResource eventResource = new EventResource(event);
eventResource.add(linkTo(EventController.class).withRel("query-events"));
eventResource.add(selfLinkBuilder.withRel("update-event"));
eventResource.add(new Link("/docs/index.html#resources-events-create").withRel("profile"));
return ResponseEntity.created(createdUri).body(eventResource);
}
private ResponseEntity<ErrorsResource> badRequest(Errors errors) {
return ResponseEntity.badRequest().body(new ErrorsResource(errors));
}