在 Weblogic 上使用 Spring 在 REST 中定义自定义错误消息
Define custom error message in REST using Spring on Weblogic
我正在托管 Spring 用于 REST 的 weblogic 10.3.6 上的启动应用程序 api
我想实现这两个功能:
- 每当我的自定义异常发生时,我都想发送带有消息的 http 响应,例如500 - "request couldn't be parsed because of something..."
- 每当抛出任何错误时,我都想获得通常打印到控制台的堆栈跟踪(用于调试目的)
我尝试通过以下方式解决第一部分:
@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.
中有回复要求一样
希望这对你们中的一些人有所帮助
好吧,就我而言,我已经完成了自定义错误处理逻辑。
我们可以定义一个接受通用类型的自定义基础响应class(例如:用户所需的模型)
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);
}
这可能不是所问问题的确切解决方案,但肯定会对其他人有所帮助。
我正在托管 Spring 用于 REST 的 weblogic 10.3.6 上的启动应用程序 api 我想实现这两个功能:
- 每当我的自定义异常发生时,我都想发送带有消息的 http 响应,例如500 - "request couldn't be parsed because of something..."
- 每当抛出任何错误时,我都想获得通常打印到控制台的堆栈跟踪(用于调试目的)
我尝试通过以下方式解决第一部分:
@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.
希望这对你们中的一些人有所帮助
好吧,就我而言,我已经完成了自定义错误处理逻辑。
我们可以定义一个接受通用类型的自定义基础响应class(例如:用户所需的模型)
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);
}
这可能不是所问问题的确切解决方案,但肯定会对其他人有所帮助。