Spring MVC로 예외를 처리하기 위해 노력하고 있습니다. @ControllerAdvice 및 @ExceptionHandler를 사용하고 있습니다. JSON을 반환하기 위해 @ResponseBody와 ResponseEntity의 두 경우를 모두 시도했습니다.
내 컨트롤러는 다음과 같습니다.
@ControllerAdvice
public class GlobalExceptionController {
@ExceptionHandler(CustomGenericException.class)
@ResponseBody
public ErrorResource handleCustomException(CustomGenericException ex) {
ErrorResource errorResource=new ErrorResource("Example 1");
errorResource.error=ex.getErrCode();
return errorResource;
}
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResource> handleAllException(Exception ex) {
ErrorResource errorResource=new ErrorResource("Example 2");
errorResource.error=ex.getMessage();
return new ResponseEntity<ErrorResource>(errorResource,HttpStatus.NOT_FOUND);
}
}
class ErrorResource {
public String error;
public ErrorResource(String a ){error=a;}
}
maven 용 tomcat 7 플러그인을 사용하여 앱을 실행하고 디버깅하므로 디버그 할 때 @ExceptionHandler가 실행되고 return 문이 실행되고 있음을 알 수 있습니다. 하지만 JSON을받는 대신 HTTP 500 오류가 발생합니다.
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.mkyong.web.exception.CustomGenericException
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
뷰를 반환하거나 ModelView가 작동하지만 ResponseBody 또는 ResponseEntity를 반환하려고 할 때마다 여전히 동일한 오류가 발생합니다.
마지막으로 바람둥이를 사용하는 대신 SpringBoot를 사용하여 앱을 실행하면 오류가 발생하지 않고 수신해야 할 응답이 있습니다.
{"error":"E888"}
Tomcat에서 작동하지 않는 이유는 무엇입니까?
감사.
그 이유는 Spring이 예외를 처리하는 방식입니다. 평범한 Spring 애플리케이션에서 Boot @ExceptionHandler
가 없는 애플리케이션 은 exceptionResolver에 의해 사용되며 브라우저 사용자를 위해 작동하거나 다른 말로 예외가 도착했을 때 렌더 페이지로 생각된다. 요청의 흐름은 contenNegotiationResolver를 통과하지 않으며 이러한 이유로 계속해서 예외가 발생합니다. Spring boot에서 요청의 수명주기 흐름은 브라우저 사용자 및 브라우저 사용자가 아닌 응용 프로그램에 대한 예외 관리로 생각되었으며 이러한 이유로 작동하므로 자세한 내용은 공식 문서를 참조하십시오.
댓글에 답변하려면 업데이트하세요.
Spring boot에서는 많은 세부 사항에 대해 일반 spring mvc 응용 프로그램과 관련하여 매우 다른 방식으로 예외를 관리합니다 .link spring boot doc 에서 문서를 참조하는 것이 좋습니다 . 평범한 봄 웹 애플리케이션을 사용하려면 aspect를 사용하도록 제안 할 수 있습니다. 평범한 @ExceptionHandler
사용법을 사용하고 @Controller
Class 의 평범한 페이지 요청에 대한 응답으로 ModelView 구현 @ResponseBody
을 반환하고 @ResponseBody로 주석이 달린 메서드에 대한 예외를 관리하고 ResponseEntity를 반환하는 측면을 만들 수 있습니다. 측면은 아래와 같이 생각할 수 있습니다.이 샘플에서는 com.springapp.mvc 패키지에서 ResponseEntity를 반환하는 메서드를 가로 채기위한 poincut 표현식을 개발했습니다.
양상:
@Aspect
@Component
public class GlobalExceptionRestAOPController {
private ObjectMapper objectMapper = new ObjectMapper();
@Around("execution(org.springframework.http.ResponseEntity com.springapp.mvc..*(..))")
public Object manageException(ProceedingJoinPoint pjp) throws Throwable{
Object result;
try{
result = pjp.proceed();
} catch (Exception e){
// log it.
result = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).contentType(MediaType.APPLICATION_JSON).body(objectMapper.writeValueAsString(new ExceptionReport(e.toString())));
}
return result;
}
}
class ExceptionReport{
private final String error;
public ExceptionReport(String error) {
this.error = error;
}
public String getError() {
return error;
}
}
구성에 삽입하는 것을 잊지 마십시오
xml 스타일 :
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:aspectj-autoproxy/>
<context:component-scan base-package="com.springapp.mvc"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
...
</beans>
자바 스타일 :
@Configuration
@EnableAspectJAutoProxy
...
class AspectConfiguration{
...
}
제어 장치:
@Controller
public class HelloController {
@RequestMapping(value = "/jsonHelloEx", method = RequestMethod.GET, produces = "application/json")
public ResponseEntity printWelcomeWithException() {
String nullableString = null;
nullableString.equals("");
return ResponseEntity.ok("Hello");
}
}
나는 그것이 당신을 도울 수 있기를 바랍니다
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다