Spring

응답으로 응답 객체와 함께 오류 맵을 보낼 수 있습니까? 올바른 방법은 무엇입니까?

기록만이살길 2021. 3. 8. 03:04
반응형

응답으로 응답 객체와 함께 오류 맵을 보낼 수 있습니까? 올바른 방법은 무엇입니까?

1. 질문(문제점):

사용자 개체를 받아들이고 응답으로 다른 사용자 개체를 반환하는 스프링 휴식 끝 점이 있습니다. 내 컨트롤러 방법은 다음과 같습니다.

@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

그리고이 흐름은 잘 작동합니다. 하지만 이제는 들어오는 JSON 필드가 정상인지 확인하기 위해 createUser 메서드 (JSR 303)에 유효성 검사를 추가해야합니다. 이를 위해 컨트롤러에 아래 코드를 추가하려고합니다.

@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 개체를 보낼 수 있도록?

2. 해결방안:

ResponseEntity <?> 유형을 반환합니다.

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