Могу ли я отправить карту ошибок вместе с объектом ответа в ответ? Каков правильный способ?

#spring #spring-boot #spring-mvc #bean-validation

#весна #spring-boot #spring-mvc #проверка компонента

Вопрос:

У меня есть конечная точка spring rest, которая принимает объект user и возвращает другой userobject в качестве ответа. Мой метод контроллера выглядит так:

 @PostMapping
public UserResponse createUser(@RequestBody UserDetailsRequestModel userDetails)
            throws Exception {
        
        UserRest userResponse= new UserRest();

        ModelMapper modelMapper = new ModelMapper();
        UserDto userDto = modelMapper.map(userDetails, UserDto.class);
        userDto.setRoles(new HashSet<>(Arrays.asList(Roles.ROLE_USER.name())));
        UserDto createdUser = userService.createUser(userDto);
        returnValue = modelMapper.map(createdUser, UserResponse.class);

        return userResponse;
    }
 

Мой класс userResponse выглядит так

 public class UserRest {

    private String userId;
    private String firstName;
    private String lastName;
    private String email;
    ....getters and setters
 

И этот поток работает нормально. Но теперь мне нужно добавить проверку в метод CreateUser (JSR 303), чтобы проверить, в порядке ли входящие поля JSON. Для этого я пытаюсь добавить приведенный ниже код в свой контроллер

 @PostMapping
    public UserResponse createUser(@Valid @RequestBody UserDetailsRequestModel userDetails, BindingResult result){

        if(result.hasErrors()){
            Map<String, String> errorMap = new HashMap<>();

            for(FieldError error: result.getFieldErrors()){
                errorMap.put(error.getField(), error.getDefaultMessage());
            }
            **return new ResponseEntity<Map<String, String>>(errorMap, HttpStatus.BAD_REQUEST);**
        }

        UserRest userResponse= new UserRest();

        ModelMapper modelMapper = new ModelMapper();
        UserDto userDto = modelMapper.map(userDetails, UserDto.class);
        userDto.setRoles(new HashSet<>(Arrays.asList(Roles.ROLE_USER.name())));
        UserDto createdUser = userService.createUser(userDto);
        returnValue = modelMapper.map(createdUser, UserResponse.class);

        return **userResponse**;
 

Очевидная проблема в моем коде заключается в том, что я не могу преобразовать ResponseEntity<Map<String,String>> в объект UserResponse .

Есть ли правильный способ сделать это? чтобы я мог отправлять ошибки (если таковые имеются) или объект UserResponse, если в том же методе контроллера нет ошибок?

Ответ №1:

Возвращает тип ResponseEntity<?>

 @PostMapping
public ResponseEntity<?> createUser(@Valid @RequestBody UserDetailsRequestModel userDetails, BindingResult result){
    if(result.hasErrors()){
        ...
        return ResponseEntity.badRequest().body(errorMap);
    }
    ...
    return ResponseEntity.ok(userRequest);
}
 

Ответ №2:

Вы можете вернуть универсальный объект HttpEntity<?> из метода контроллера, принимающего оба типа ответа. Вы должны обернуть ответ UserResponse вокруг объекта ResponseEntity