当前位置: 首页 > 知识库问答 >
问题:

Java8中的Spring-boot@ExceptionHandler未被伸出

何承
2023-03-14

我在我的Java8应用程序中使用@excpetionhandler。我无法接触到这个功能。对于所有异常,HTTP响应总是500(带有我插入到异常中的消息),并且忽略@exceptionHandler方法。

当我的同事用Java7编译器运行该应用程序时,它可以工作。

@ExceptionHandler注释不能在Java8中使用的原因是什么?

控制器:

import org.apache.catalina.servlet4preview.http.HttpServletRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import vce.exception.InputParameterException;


@Controller
@RestController
public class VRestController {


    @Resource(name="aManager")
    AManager aManager;

    public void setAManager(AManager aManager) {
        this.aManager = aManager;
    }


    @RequestMapping(value ="/authentication/signature", method = RequestMethod.PUT)
    public ResponseEntity<Object> signature(@RequestBody final Signature signature) {

        return handle(Marker.UseCases.SIGNATURE, new Supplier<Integer>() {

            @Override
            public Integer get() {
                validateInput(signature);
                aManager.doSomething(signature);
                return 0;
            }

        });
    }


    private ResponseEntity<ErrorResponse> handle(UseCases useCase, Supplier<Integer> supplier) {

        final Marker marker = Marker.REQUEST_MARKER.get();
        marker.startUseCase().setUseCase(useCase.name()).setStartTime(DateTime.now());
        try{
            marker.setSerializationId(serializationID);

            supplier.get();
        }

        catch (Exception e) {
            marker.setException(e);

            throw e;
        }

        finally {
          ......
        }

        return ResponseEntity.ok(new ErrorResponse(200,0,"Success"));
    }


    private static void validateInput(Signature signature) {
        final String missingErr = "The request is missing the following parameter: ";

        if(signature.getData()==null) {
            throw new InputParameterException(missingErr+VConstants.DATA_FIELD_NAME, VErrorCodeEnum.MISSING_FIELD);
        }

        if(signature.getSignature()==null) {
            throw new InputParameterException(missingErr+VConstants.SIGNATURE_FIELD_NAME, VErrorCodeEnum.MISSING_FIELD);
        }
    }


    @ExceptionHandler(InputParameterException.class)
    @ResponseStatus(value= HttpStatus.BAD_REQUEST)
    @ResponseBody
    public ErrorResponse handleInputParameterException(HttpServletRequest req, InputParameterException e) {
        .....
        return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), e.getErrorCode().getCode(), e.getMessage());
    }


    @ExceptionHandler(Exception.class)
    @ResponseStatus(value= HttpStatus.INTERNAL_SERVER_ERROR, reason="Internal Server Error - Any Exception")
    public void handleAnyException(HttpServletRequest req, Exception e) {

        .....
    }

    static class ErrorResponse {

        public int statusCode;
        public int errorCode;
        public String message;

        public ErrorResponse(int statusCode, int errorCode, String message) {
            this.statusCode = statusCode;
            this.errorCode = errorCode;
            this.message = message;
        }
    }
}
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.4.1.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>
</dependencies>
{
  "timestamp": 1494863566131,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "com.nds.ch.vge.vaus.exception.InputParameterException",
  "message": "org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.nds.ch.vge.vaus.exception.InputParameterException: The request is missing the following parameter: data",
  "path": "/authentication/signature"
}

我删除了@controller注释,并尝试使用解析器,但它不起作用。

解析器的代码,在与rest控制器类相同的包中:

@RestControllerAdvice
@EnableWebMvc
public class GlobalControllerExceptionHandler {


        @ExceptionHandler(InputParameterException.class)
        @ResponseStatus(value= HttpStatus.BAD_REQUEST)
        public ErrorResponse handleInputParameterException(HttpServletRequest req, InputParameterException e) {
            .....
            return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), e.getErrorCode().getCode(), e.getMessage());
        }


        @ExceptionHandler(Exception.class)
        @ResponseStatus(value= HttpStatus.INTERNAL_SERVER_ERROR, reason="Internal Server Error - Any Exception")
        public void handleAnyException(HttpServletRequest req, Exception e) {

            .....
        }
}

共有1个答案

狄兴业
2023-03-14

为了让Spring Boot接收您的处理程序,您必须将其放在一个单独的类中,并对其进行适当的注释。

@RestControllerAdvice
@EnableWebMvc
public class GlobalControllerExceptionHandler {

    @ExceptionHandler(value = { NoHandlerFoundException.class })
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ApiErrorResponse noHandlerFoundException(Exception ex) {
        return new ApiErrorResponse(404, 4041, ex.getMessage());
    }
}

另外,我认为用@restcontroller@controller注释控制器类也不是一个有效的选项。选择其中一个并相应地注释异常处理程序类(@restControllerAdvise@ControllerAdvise)

 类似资料:
  • 我正在为Spring Boot应用程序进行异常处理。我已经创建了我自己的异常类witch,一切都很好,我在控制台中得到了异常,但我无法到达我的@ExceptionHandler方法。 引发异常的类: 我的应用程序中没有其他异常处理程序,在抛出后,我得到了我设置的消息

  • 在我的spring boot应用程序中,我有一个用于post请求的控制器,它生成和使用JSON请求,并且我为这个控制器定义了@ExceptionHandler,它使用HttpMediaTypeNotAcceptableException来捕获HttpMediaTypeNotAcceptableException(406状态代码)异常。 现在,每当我调用带有错误的ACCEPT头(如applicati

  • 我有一个方面类,用于记录使用泛型方法之前和之后(周围)的方法执行情况: 在方法中,我抛出了一个在logMethod中捕获的可抛出异常,并抛出了一个自定义异常,而不是类型 在我的控制器建议中,我有以下内容: 项目结构: 控制台:

  • 它们是我可以在sprint-boot应用程序上动态地向上和向下缩放消费者的一种方式吗?

  • 我使用的是Spring Boot1.5.7。我有一个ExceptionHandler用于返回ResponseEntity的异常 在返回ResponseEntity/@responseBody(JSON/XML响应)的api调用期间发生异常的情况下,这种方法工作得很好 null

  • 我创建了一个类来保存一些@ExceptionHandler,这样我就可以捕捉InvalidWSUserException,并用一个JSON字符串响应,通知请求客户机请求中的令牌无效。 我已经在另一个项目中工作了这个,但我似乎无法在这个新项目中工作。 InvalidWSUserException为空,因为处理程序应该处理响应; 为了确认,我在浏览器中看到的输出是错误500 json响应;其中应该是来