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
'programing' 카테고리의 다른 글
팬더의 데이터 정규화 (0) | 2023.09.07 |
---|---|
jQuery - 입력 필드의 관련 레이블 요소를 선택합니다. (0) | 2023.09.07 |
Excel 2010 셀에서 특정 문자를 삭제하는 방법 (0) | 2023.09.07 |
CMake로 포코 만들기:MySQL 지원 사용 안 함 - MySQL 라이브러리 없음 (0) | 2023.09.07 |
Secure openssl MariaDB - Public Server의 PhpMyAdmin (0) | 2023.09.07 |