Return spring 引导中的响应消息

Return response messages in spring boot

我正在 spring 使用 h2 数据库启动。我想 return 成功插入寄存器时发送 201 消息,复制时发送 400 消息。我正在使用 ResponseEntity 来实现这一点,例如,下一个是我从服务中创建的方法:

    @Override
    public ResponseEntity<Object> createEvent(EventDTO eventDTO) {
        if (eventRepository.findOne(eventDTO.getId()) != null) {
            //THis is a test, I am looking for the correct message
            return new ResponseEntity(HttpStatus.IM_USED);
        }
        Actor actor = actorService.createActor(eventDTO.getActor());
        Repo repo = repoService.createRepo(eventDTO.getRepo());
        Event event = new Event(eventDTO.getId(), eventDTO.getType(), actor, repo, createdAt(eventDTO));
        eventRepository.save(event);
        return new ResponseEntity(HttpStatus.CREATED);
    }

这是我的控制器:

    @PostMapping(value = "/events")
    public ResponseEntity addEvent(@RequestBody EventDTO body) {
        return eventService.createEvent(body);
    }

但是我在浏览器中没有收到任何消息,我正在使用 postman 进行不同的测试,当我查询所有事件时,结果都是正确的,但每次我都post 我在浏览器中没有收到任何消息,我不太确定这个问题的原因是什么。有什么想法吗?

向客户端发送 Response 的理想方式是在 Controller

中使用 ResponseEntity 创建 DTO/DAO

Controller.java

@PostMapping("/test")
        public ResponseEntity<Object> testApi(@RequestBody User user)
        {
            System.out.println("User: "+user.toString());
            return assetService.testApi(user);
        }

Service.java

public ResponseEntity testApi(User user) {  
        if(user.getId()==1)
            return new ResponseEntity("Created",HttpStatus.CREATED);
        else
            return new ResponseEntity("Used",HttpStatus.IM_USED);   
           // for BAD_REQUEST(400) return new ResponseEntity("Bad Request",HttpStatus.BAD_REQUEST);
    }

使用 Postman 测试

状态 201 已创建

已使用状态 226 IM

好吧,发送 ResponseEntity 而不是 Controller 的服务我真的感觉不太好。你可以使用 @ResponseStatusExceptionHandler class es 对于这些情况,如下所示。

exception 包中创建 class

GlobalExceptionHandler.java

@ControllerAdvice
public class GlobalExceptionHandler {
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(DataIntegrityViolationException.class) // NOTE : You could create a custom exception class to handle duplications
    public void handleConflict() {
    }
}

Controller.java

@PostMapping(value = "/events")
@ResponseStatus(HttpStatus.CREATED) // You don't have to return any object this will take care of the status
public void addEvent(@RequestBody EventDTO body) {
   eventService.createEvent(body);
}

现在更改服务看起来像

Service.java

@Override
public void createEvent(EventDTO eventDTO) { // No need to return
   if (eventRepository.findOne(eventDTO.getId()) != null) {
        throw new DataIntegrityViolationException("Already exists"); // you have to throw the same exception which you have marked in Handler class
   }
   Actor actor = actorService.createActor(eventDTO.getActor());
   Repo repo = repoService.createRepo(eventDTO.getRepo());
   Event event = new Event(eventDTO.getId(), eventDTO.getType(), actor, repo, createdAt(eventDTO));
   eventRepository.save(event);
}