#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