아카이브

[스프링 기반 REST API 개발] API Index Handler, ErrorsResource 추가하기 본문

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));
    }