@ExceptionHandler 응답이 Tomcat에서 작동하지 않습니다.

Rcentellesc

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사용법을 사용하고 @ControllerClass 의 평범한 페이지 요청에 대한 응답으로 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Tomcat이 포트 8080에서 응답하지 않습니다.

분류에서Dev

로봇이 동작 중에 응답하지 않습니다.

분류에서Dev

PHP 버전 5.3.24에서 JSON 응답이 작동하지 않습니다.

분류에서Dev

jQuery DataTable 응답이 Boostrap 3에서 작동하지 않습니다.

분류에서Dev

작은 장치에서 창이 응답하지 않습니다.

분류에서Dev

Angular가 Ajax 응답에서 작동하지 않습니다.

분류에서Dev

플러그인이 작업에 응답하지 않습니다.

분류에서Dev

Ajax 응답에서 false가 작동하지 않고 양식이 제출을 취소하지 않습니다.

분류에서Dev

Video.js 응답 성이 작은 화면에서 작동하지 않습니다.

분류에서Dev

다른 http 요청 성공 응답 내부의 http 요청이 jquery에서 작동하지 않습니다.

분류에서Dev

.gif가 파이썬에서 응답하지 않습니다.

분류에서Dev

반짝임 : textInput이 R에서 응답하지 않습니다.

분류에서Dev

내 버튼이 Android Studio에서 응답하지 않습니다.

분류에서Dev

Ajax는 wordpress의 응답 데이터에서 '0을 반환하고 die ()가 작동하지 않습니다.

분류에서Dev

genymotion에서 테스트하는 동안 앱이 응답하지 않습니다.

분류에서Dev

jQuery에서 GET 응답이 작동하지 않음

분류에서Dev

Ubuntu는 동일한 인터페이스에서 응답하지 않습니다.

분류에서Dev

Express의 응답 스트리밍이 Azure App Service에서 작동하지 않습니다.

분류에서Dev

Telegram Bot이 메시지에 응답하지 않습니다.

분류에서Dev

alertify.alert가 mithril (m.request) 응답에서 작동하지 않습니다.

분류에서Dev

javamelody 1.58 보안이 tomcat8에서 작동하지 않습니다.

분류에서Dev

Spring Boot War-File이 Tomcat에서 작동하지 않습니다.

분류에서Dev

RecyclerView onClickItem이 클릭에 응답하지 않습니다

분류에서Dev

Discord 봇이 명령에 응답하지 않습니다.

분류에서Dev

Discord 봇이 명령에 응답하지 않습니다.

분류에서Dev

jQueryUI Resizable이 옵션 변경에 응답하지 않습니다.

분류에서Dev

onListItemClick이 클릭에 응답하지 않습니다.

분류에서Dev

NSURLProtocol이 UIWebview에 응답하지 않습니다.

분류에서Dev

버튼이 Ionic의 클릭에 응답하지 않습니다.

Related 관련 기사

  1. 1

    Tomcat이 포트 8080에서 응답하지 않습니다.

  2. 2

    로봇이 동작 중에 응답하지 않습니다.

  3. 3

    PHP 버전 5.3.24에서 JSON 응답이 작동하지 않습니다.

  4. 4

    jQuery DataTable 응답이 Boostrap 3에서 작동하지 않습니다.

  5. 5

    작은 장치에서 창이 응답하지 않습니다.

  6. 6

    Angular가 Ajax 응답에서 작동하지 않습니다.

  7. 7

    플러그인이 작업에 응답하지 않습니다.

  8. 8

    Ajax 응답에서 false가 작동하지 않고 양식이 제출을 취소하지 않습니다.

  9. 9

    Video.js 응답 성이 작은 화면에서 작동하지 않습니다.

  10. 10

    다른 http 요청 성공 응답 내부의 http 요청이 jquery에서 작동하지 않습니다.

  11. 11

    .gif가 파이썬에서 응답하지 않습니다.

  12. 12

    반짝임 : textInput이 R에서 응답하지 않습니다.

  13. 13

    내 버튼이 Android Studio에서 응답하지 않습니다.

  14. 14

    Ajax는 wordpress의 응답 데이터에서 '0을 반환하고 die ()가 작동하지 않습니다.

  15. 15

    genymotion에서 테스트하는 동안 앱이 응답하지 않습니다.

  16. 16

    jQuery에서 GET 응답이 작동하지 않음

  17. 17

    Ubuntu는 동일한 인터페이스에서 응답하지 않습니다.

  18. 18

    Express의 응답 스트리밍이 Azure App Service에서 작동하지 않습니다.

  19. 19

    Telegram Bot이 메시지에 응답하지 않습니다.

  20. 20

    alertify.alert가 mithril (m.request) 응답에서 작동하지 않습니다.

  21. 21

    javamelody 1.58 보안이 tomcat8에서 작동하지 않습니다.

  22. 22

    Spring Boot War-File이 Tomcat에서 작동하지 않습니다.

  23. 23

    RecyclerView onClickItem이 클릭에 응답하지 않습니다

  24. 24

    Discord 봇이 명령에 응답하지 않습니다.

  25. 25

    Discord 봇이 명령에 응답하지 않습니다.

  26. 26

    jQueryUI Resizable이 옵션 변경에 응답하지 않습니다.

  27. 27

    onListItemClick이 클릭에 응답하지 않습니다.

  28. 28

    NSURLProtocol이 UIWebview에 응답하지 않습니다.

  29. 29

    버튼이 Ionic의 클릭에 응답하지 않습니다.

뜨겁다태그

보관