【发布时间】:2019-03-05 08:12:19
【问题描述】:
我创建了一个自定义异常,以在出现问题时通知用户。例如。如果用户从前端发送一些不正确的数据并检查是否发生在后端深处的某处而不是我需要做的只是为了
抛出新的 CustomException("Message", 406)
带有消息和错误代码。之后将立即向前端发送一个包含错误代码和文本消息的响应,我可以在 UI 上显示它们,例如作为小吃店。
自定义异常
public class CustomException extends RuntimeException {
private final int errorCode;
private static final long serialVersionUID = 6220614065727287629L;
public CustomException(String message, int errorCode) {
super(message);
this.errorCode = errorCode;
}
int getErrorCode() {
return errorCode;
}
}
CustomExceptionMapper
@Provider
public class CustomExceptionMapper implements ExceptionMapper<CustomException> {
@Override
public Response toResponse(CustomException ex) {
ErrorResponse response = new ErrorResponse(ex.getMessage(), ex.getErrorCode());
return Response.status(ex.getErrorCode()).entity(response).build();
}
}
错误响应
公共类错误响应 {
private Error error;
ErrorResponse(String errorMessage, int errorCode) {
createError(errorMessage, errorCode);
}
private void createError(String message, int code) {
setError(new Error(message, code));
}
public Error getError() {
return error;
}
public void setError(Error error) {
this.error = error;
}
}
错误
public class Error {
private String message;
private int code;
public Error(String message, int code) {
this.message = message;
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
但现在我需要一些额外的功能。对于后端的表单验证,我还需要发送哪个文本字段不正确。所以我认为最好的方法是创建一个新的 CustomException 子异常并在那里添加一个新属性。
CustomFormException
public class CustomFormException extends CustomException {
private final String formField;
private static final long serialVersionUID = 6220614065727287630L;
public CustomFormException(String message, int errorCode, String formField) {
super(message, errorCode);
this.formField = formField;
}
String getFormField() {
return formField;
}
}
我可以稍微修改一下ErrorResponse 和Error 类。添加新的构造函数和新的属性 textField
public class ErrorResponse {
private Error error;
ErrorResponse(String errorMessage, int errorCode) {
createError(errorMessage, errorCode);
}
ErrorResponse(String errorMessage, int errorCode, String textField) {
createError(errorMessage, errorCode, textField);
}
private void createError(String message, int code) {
setError(new Error(message, code));
}
private void createError(String message, int code, String textField) {
setError(new Error(message, code, textField));
}
public Error getError() {
return error;
}
public void setError(Error error) {
this.error = error;
}
}
错误
public class Error {
private String message;
private int code;
private int String textField;
public Error(String message, int code) {
this.message = message;
this.code = code;
}
public Error(String message, int code, String textField) {
this.message = message;
this.code = code;
this.textField = textField;
}
// setters and getters
}
但是我还需要创建一个新的 Mapper,因为旧的 Mapper 是为 CustomException 制作的,而在 CustomException 中没有 textField 属性。
是否可以以某种方式为所有自定义异常使用一个映射器,而不是为每个自定义异常创建额外的映射器?
【问题讨论】: