首页 > 解决方案 > spring boot jar和intellij idea中错误处理的不同行为

问题描述

我用spring boot开发了一个应用程序。

应用程序包含一个全局异常处理程序,当我从 Intellij IDEA 运行(或调试)应用程序时可以正常工作。

但是,当我执行最终 jar(由 maven clean install 创建)时,错误处理程序不起作用(以及所有向客户端提供所需信息的编程异常)已被替换为白页 500 错误或 API 中的 500 错误响应。

这是我想传递给客户端的示例结果(当我使用 IDE 运行应用程序时它将被发送给客户端)

{
    "apierror": {
        "status": "BAD_REQUEST",
        "timestamp": {
            "month": "OCTOBER",
            "year": 2019,
            "dayOfMonth": 16,
            "dayOfWeek": "WEDNESDAY",
            "dayOfYear": 289,
            "monthValue": 10,
            "hour": 15,
            "minute": 18,
            "nano": 904000000,
            "second": 44,
            "chronology": {
                "id": "ISO",
                "calendarType": "iso8601"
            }
        },
        "code": "error.user.not-found-Username",
        "message": "error.user.not-found-Username",
        "localizedMessage": "error.user.not-found-Username",
        "subErrors": null,
        "Username": "notfoundusername"
    }
}

这是从java -jar应用程序返回的消息:

{
    "timestamp": "2019-10-16T15:17:20.337+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "No message available",
    "path": "/login"
}

这是错误处理程序:

@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
@RequiredArgsConstructor
public class BaseBusinessExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(BaseBusinessException.class)
    public ResponseEntity<Object> handleBaseBusinessException(
        final BaseBusinessException ex,
        final HttpServletRequest request
    ) {
        ApiError apiError = new ApiError(ex.getHttpStatus());
        String acceptLanguage = request.getHeader("Accept-Language");
        if (Empty.isNotEmpty(acceptLanguage)) {
            Locale locale = new Locale(acceptLanguage);
            apiError.setLocalizedMessage(initializeMessage(ex.getErrorCode(), ex.getMessageArgs(), locale));
        }
        apiError.setCode(ex.getErrorCode());
        apiError.setMessage(initializeMessage(ex.getErrorCode(), ex.getMessageArgs(), Locale.getDefault()));
        if (Empty.isNotEmpty(ex.getMessageArgs())) {
            Map<String, Object> meta = new HashMap<>(ex.getMessageArgs());
            apiError.setMeta(meta);
        }
        return buildResponseEntity(apiError);
    }

这就是抛出异常的地方:

        User user = userRepository.findOneByUsername(arg.getUsername());
        if (user == null) {
            throw new UserNotFoundException(arg.getUsername());
        }

谁能帮我解决这个问题?

标签: javaspringspring-booterror-handling

解决方案


推荐阅读