在 Weblogic 上使用 Spring 在 REST 中定义自定义错误消息

Define custom error message in REST using Spring on Weblogic

我正在托管 Spring 用于 REST 的 weblogic 10.3.6 上的启动应用程序 api 我想实现这两个功能:

  1. 每当我的自定义异常发生时,我都想发送带有消息的 http 响应,例如500 - "request couldn't be parsed because of something..."
  2. 每当抛出任何错误时,我都想获得通常打印到控制台的堆栈跟踪(用于调试目的)

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

@ControllerAdvice
public class ExceptionHandlerAdvice {


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

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

但是作为响应,我只收到 500 内部服务器错误,没有任何消息

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

我该如何解决这个问题?

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

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

有效,但我必须从代​​码中向消息中添加一些变量,但此方法不允许这样做

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

不要return东西,扔一个:

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

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

}

或其他类似的事情。

创建带有消息和状态的“ResponseEntity”对象并return它,它将显示错误消息。

/**
 * 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);
}

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

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

errMsg应该写成你想要的格式。就像我在 JSON.

中有回复要求一样

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

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

  1. 我们可以定义一个接受通用类型的自定义基础响应class(例如:用户所需的模型)

  2. Return BaseResponse 作为每个 REST 方法的响应 (获取、放置、POST、删除等)

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;
}
}

User.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);

    }

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