【问题标题】:Define custom error message in REST using Spring on Weblogic在 Weblogic 上使用 Spring 在 REST 中定义自定义错误消息
【发布时间】:2017-11-01 00:18:08
【问题描述】:

我在 weblogic 10.3.6 上为 REST api 托管 Spring Boot 应用程序 我想实现这两个功能:

  1. 每当我的自定义异常发生时,我想发送一个带有消息的 http 响应,例如500 - “由于某些原因无法解析请求...”
  2. 无论何时抛出任何错误,我都希望获得通常打印到控制台的堆栈跟踪(用于调试目的)

我尝试通过以下方式解决第一部分:

@ControllerAdvice
public class ExceptionHandlerAdvice {


    @ExceptionHandler(MyException.class)
    public ResponseEntity handleException(MyException e) {

        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
    }

但是作为响应,我只收到 500 Internal Server Error 没有消息

至于第二部分,我尝试了类似的方法,但也没有错误消息。

我该如何解决这个问题?

编辑: 我能做到的最好的事情是删除 ExceptionHandlerAdvice 并在我的异常类上使用注释,而不是像这样:

@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR, reason="This is a message I'd like to send")

它可以工作,但我必须从代​​码中添加一些变量到消息中,而这种方法不允许这样做

编辑2: 这有点奇怪,可能是 weblogic 服务器的行为,但是当我将 httpStatus 设置为 HttpStatus.ACCEPTED 时,我可以看到消息,如果是 HttpStatus.Forbidden 或任何其他 4xx 错误,我只会收到没有消息的错误

【问题讨论】:

  • 你好虫族,这里是人类。也许您的服务抛出不受 ExceptionHandlerAdvice 控制的异常,尝试使用 system.out 调试并打印到控制台
  • 我故意在一种方法中抛出 MyException: throw new MyException("some message");
  • 你好 zerg,尝试在 handleException 方法中抛出异常。参考这里:stackoverflow.com/questions/39517876/…

标签: java spring spring-boot weblogic-10.x


【解决方案1】:

不要返回东西,扔一个:

@ResponseStatus(value = HttpStatus.UNPROCESSABLE_ENTITY)
public class UnprocessableEntity extends RuntimeException {

    public UnprocessableEntity(String string) {
        super(string);
    }

}

或者其他类似的东西。

【讨论】:

  • 即使我使用@ResponseStatus 注释,并添加原因参数,如:@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR, reason="我想打印的消息") 我无法将代码中的参数传递给错误消息,所以这不是答案
  • String msg = "YOUR MESSAGE FROM YOUR CODE"; throw new UnprocessableEntity(msg); 顺便说一句,UnprocessableEntity 是一个自定义的Exception,这意味着只要扩展RuntimeException,您就可以构建自己的。
  • 是的,这就是我正在做的,它不返回消息,只返回状态码,如 500、422 等
  • 好的,您希望您的消息作为响应正文中的文本;不是错误消息。
【解决方案2】:

创建带有消息和状态的'ResponseEntity'对象并返回它,它将显示错误消息。

/**
 * HTTP_STATUS - 500 -Service Unavailable.
 * 
 * @param exception
 *            Catches the following: MyException
 * @return
 */
@ExceptionHandler({ MyException.class})
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public static ResponseEntity<?> handleConnectionErrorResponse(MyException exception) {
    return new ResponseEntity<String>("Some error occurred at server", HttpStatus.INTERNAL_SERVER_ERROR);
}

【讨论】:

  • 这仍然没有给我超过 500 Internal Server Error without error message
  • 每当我发送错误时,我都无法收到消息,当我使用 HttpStatus.ACCEPTED 时,我看到了消息,有什么想法吗?
  • 没有遇到这个问题,不知道是什么原因造成的。
  • 我只会发送带有接受状态的消息,这解决了我的问题,你的回答是最有帮助的
【解决方案3】:

我也经历了同样的要求。 以下是对我有用的代码:

String errMsg = "{\"errorMessage\":\"Parking Slot is not available\"}";
return new ResponseEntity<String>(errMsg, HttpStatus.INTERNAL_SERVER_ERROR);

errMsg 应该以您想要的格式编写。就像我需要 JSON 响应一样。

希望这对你们中的一些人有所帮助

【讨论】:

    【解决方案4】:

    好吧,就我而言,我已经完成了自定义错误处理逻辑。

    1. 我们可以定义一个自定义的 Base Response 类,它接受泛型类型(例如:用户所需的模型)

    2. 返回 BaseResponse 作为每个 REST 方法的响应 (GET、PUT、POST、DELETE 等)

    BaseResponse.java

    public class BaseResponse<T> {
    int statusCode;
    String message;
    T data;
    
    public int getStatusCode() {
        return statusCode;
    }
    
    public BaseResponse<T> getValidResponse(String message, T data) {
        BaseResponse<T> baseResponse = new BaseResponse<T>();
        baseResponse.statusCode = 200;
        baseResponse.message = message;
        baseResponse.data = data;
        return baseResponse;
    }
    
    public BaseResponse<T> getErrorResponse(int StatusCode, String message) {
        BaseResponse<T> baseResponse = new BaseResponse<T>();
        baseResponse.statusCode = StatusCode;
        baseResponse.message = message;
        return baseResponse;
    }
    
    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }
    
    public String getMessage() {
        return message;
    }
    
    public void setMessage(String message) {
        this.message = message;
    }
    
    public T getData() {
        return data;
    }
    
    public void setData(T data) {
        this.data = data;
    }
    }
    

    用户.java

    public class User {
        String userName;
        String userAddress;
        String userEmail;
        String userPhoneNumber;
        ... 
        //Getters & Setters
    }
    

    YourController.java

    ....
        @PostMapping("/addUser")
        public BaseResponse<User> addUser(User user) {
            if (user.getUserName() != null && !user.getUserName().equals("")) {
            UserEntity userEntity = new UserEntity();
            userEntity.setName(user.getUserName());
            ...
            userRepository.save(userEntity);
            return new BaseResponse<User>().getValidResponse("Successfully Added User", user);
            } else {
                 return new BaseResponse<User>().getErrorResponse(400, "Name field is required");
            }
        }
    ...
        @DeleteMapping("/deleteUser/{userId}")
        //Using ? for uncertain Response.Eg: Some response might have data response and some may not have data response...
        public BaseResponse<?> deleteUser(@PathVariable(value = "userId") int userId) {
             //After delete operation...we don't require data response.
             return new BaseResponse<User>().getValidResponse("Successfully deleted the User", null);
    
        }
    

    对于所提出的问题,这可能不是一个确切的解决方案,但肯定会对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-07-14
      • 1970-01-01
      • 2016-06-16
      • 2021-06-06
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      相关资源
      最近更新 更多