programing

Java Spring - 누락된 필수 요청 매개 변수를 처리하는 방법

javamemo 2023. 9. 7. 21:26
반응형

Java Spring - 누락된 필수 요청 매개 변수를 처리하는 방법

다음과 같은 매핑을 고려해 봅니다.

@RequestMapping(value = "/superDuperPage", method = RequestMethod.GET)
public String superDuperPage(@RequestParam(value = "someParameter", required = true) String parameter)
{
    return "somePage";
}

누락된 parameter case를 추가하지 않고 처리하고 싶습니다.required = false. 기본적으로,400오류는 반환되지만, 다른 페이지를 반환하고 싶습니다.어떻게 하면 이것을 이룰 수 있을까요?

필요한 경우@RequestParam요청에 없습니다. Spring은 예외를 던집니다.다음을 정의할 수 있습니다.@ExceptionHandler동일한 컨트롤러 또는 A에서@ControllerAdvice그 예외를 처리하려면:

@ExceptionHandler(MissingServletRequestParameterException.class)
public void handleMissingParams(MissingServletRequestParameterException ex) {
    String name = ex.getParameterName();
    System.out.println(name + " parameter is missing");
    // Actual exception handling
}

나는 다시 돌아가고 싶습니다. 다른 페이지로 합시다.어떻게 하면 이를 달성할 수 있을까요?

스프링 문서에 명시된 바와 같이:

A로 주석을 단 표준 컨트롤러 방법과 매우 유사합니다.@RequestMapping주석, 메서드 인수 메서드의 반환 값은 유연할 수 있습니다.예를 들면.HttpServletRequest서블릿(Servlet) 환경에서 액세스할 수 있습니다.PortletRequest포틀렛 환경에서.반환 유형은 뷰 이름으로 해석되는 a일있습니다.ModelAndView목적어, aResponseEntity, 또는 추가할 수도 있습니다.@ResponseBody메서드 반환 값을 메시지 변환기로 변환하여 응답 스트림에 기록합니다.

대안.

클래스에서 @ControllerAdvice를 사용하고 Spring base 클래스 ResponseEntity를 확장하는 경우예외 처리자.이를 위해 기본 클래스에 미리 정의된 함수가 생성되었습니다.핸들러에서 이를 무시해야 합니다.

    @Override
protected ResponseEntity<Object> handleMissingServletRequestParameter(MissingServletRequestParameterException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
    String name = ex.getParameterName();
    logger.error(name + " parameter is missing");

    return super.handleMissingServletRequestParameter(ex, headers, status, request);
}

이 기본 클래스는 특히 프레임워크가 생성하는 유효성 검사 오류를 처리하려는 경우 매우 유용합니다.

작업은 옵션 유형을 활용하여 Spring 4.1 이상 및 Java 8에서 수행할 수 있습니다.예에서는 @RequestParam을 의미합니다. String이제는 의 유형을 갖게 될 것을 가질 것입니다.Optional<String>.

이 기능을 보여 주는 예를 위해 이 기사를 살펴 보십시오.

관련이 없을 수도 있지만, 비슷한 요구를 하게 되었습니다. 인증 헤더 누락에 대해 5xx 오류를 4xx 오류로 변경하는 것입니다.

컨트롤러는 다음과 같습니다.

@RequestMapping("list")
public ResponseEntity<Object> queryXXX(@RequestHeader(value = "Authorization") String token) {
...
}

권한 부여 헤더 없이 URL을 지정하면 5xx 오류가 발생합니다.

curl --head -X GET "http://localhost:8081/list?xxx=yyy" -H "accept: */*"

HTTP/1.1 500
...

401로 변경하시면 됩니다.

@ExceptionHandler(org.springframework.web.bind.MissingRequestHeaderException.class)
@ResponseBody
public ResponseEntity<Object> authMissing(org.springframework.web.bind.MissingRequestHeaderException ex) {
        log.error(ex.getMessage(), ex);

        return IResponse.builder().code(401).message(ex.getMessage()).data(null).build();
}


@Data
public class IResponse<T> implements Serializable {
    private Integer code;
    private String message = "";
    private T data;
...
}

자동화 테스트를 통해 확인할 수 있습니다.

@Test
void testQueryEventListWithoutAuthentication() throws Exception {
    val request = get("/list?enrollEndTime=1619176774&enrollStartTime=1619176774&eventEndTime=1619176774&eventStartTime=1619176774");
    mockMvc.perform(request).andExpect(status().is4xxClientError());
}

언급URL : https://stackoverflow.com/questions/37746428/java-spring-how-to-handle-missing-required-request-parameters

반응형