Bhu*_*van 9 java cxf exception jax-rs interceptor
我们需要在REST调用期间发生异常时返回自定义错误代码和错误消息.我们已经创建了一个异常映射器提供程序,它适用于应用程序代码中的异常.但是,当从CXF代码发生异常时(例如,形成我编写的CustomValidationInterceptor),它不起作用.
例如,如果我请求无效路径参数(例如无效的phoneNumber).在这种情况下,我们需要返回一个JSON格式的自定义错误代码和错误消息,但即使我们创建以处理WebApplicationException一个例外映射器提供商这是行不通的.
有没有办法处理来自cxf拦截器的异常并返回对用户的响应,如下所示?
{
"errorDetail": {
"errorCode": "404",
"errorMessage": "Bad Request"
}
}
Run Code Online (Sandbox Code Playgroud)
我的CustomValidationInterceptor的代码片段:
public class CustomValidationInterceptor extends AbstractPhaseInterceptor<Message>{
public CustomValidationInterceptor() {
super(Phase.PRE_INVOKE); // Put this interceptor in this phase
}
public void handleMessage(Message message) {
MetadataMap<String, String> metadataMap = (MetadataMap<String, String>) message.get("jaxrs.template.parameters");
if(null != metadataMap) {
List<String> list = metadataMap.get("phoneNumber");
if(null != list) {
String phoneNumber = list.get(0);
boolean result = validatePhoneNumber(phoneNumber);
if(!result){
throw new TelusServiceException(Response.status(Response.Status.BAD_REQUEST).build(), 400, "phone number not valid");
}
} else {
throw new TelusServiceException(Response.status(Response.Status.BAD_REQUEST).build(), 400, "phone number not valid");
}
} else {
throw new TelusServiceException(Response.status(Response.Status.BAD_REQUEST).build(), 400, "phone number not valid");
}
}
public boolean validatePhoneNumber(String phoneNumber) {
Pattern pattern = Pattern.compile("^[1-9]\\d{9}$");
Matcher matcher = pattern.matcher(phoneNumber);
if (!matcher.matches()) {
return false;
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我的自定义异常映射器提供程序的代码片段
public class TelusExceptionHandler implements ExceptionMapper<TelusServiceException> {
public Response toResponse(TelusServiceException exception) {
return Response.status(exception.getErrorDetail().getErrorCode()).entity(exception.getErrorDetail()).build();
}
}
Run Code Online (Sandbox Code Playgroud)
TelusServiceException的代码片段
public class TelusServiceException extends WebApplicationException{
// constructors and other methods
private ErrorDetail errorDetail = null;
public ErrorDetail getErrorDetail() {
return errorDetail;
}
public void setErrorDetail(ErrorDetail errorDetail) {
this.errorDetail = errorDetail;
}
public TelusServiceException(Response response, int errorCode, String errorMessage) {
super(response);
errorDetail = new ErrorDetail();
errorDetail.setErrorCode(errorCode);
errorDetail.setErrorMessage(errorMessage);
}
}
Run Code Online (Sandbox Code Playgroud)
ErrorDetail类的代码片段
@XmlRootElement(name="errorDetail")
public class ErrorDetail {
private int errorCode;
private String errorMessage;
@XmlElement(name = "errorCode")
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
@XmlElement(name = "errorMessage")
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}
Run Code Online (Sandbox Code Playgroud)
我找到了一种从拦截器发送自定义响应的方法,但仍无法找到从拦截器调用我的CustomExceptionHandler的方法
码:
public void handleMessage(Message message) {
MetadataMap<String, String> metadataMap = (MetadataMap<String, String>) message.get("jaxrs.template.parameters");
if(null != metadataMap) {
List<String> list = metadataMap.get("phoneNumber");
if(null != list) {
String phoneNumber = list.get(0);
boolean result = validatePhoneNumber(phoneNumber);
if(!result){
// Create a response object and set it in the message.
// calling getExchange() will not call your service
Response response = Response
.status(Response.Status.BAD_REQUEST)
.entity(new ErrorDetail(Response.Status.BAD_REQUEST.getStatusCode(), Response.Status.BAD_REQUEST.toString()))
.build();
message.getExchange().put(Response.class, response);
// That's it
}
} else {
Response response = Response
.status(Response.Status.BAD_REQUEST)
.entity(new ErrorDetail(Response.Status.BAD_REQUEST.getStatusCode(), Response.Status.BAD_REQUEST.toString()))
.build();
message.getExchange().put(Response.class, response);
}
} else {
Response response = Response
.status(Response.Status.BAD_REQUEST)
.entity(new ErrorDetail(Response.Status.BAD_REQUEST.getStatusCode(), Response.Status.BAD_REQUEST.toString()))
.build();
message.getExchange().put(Response.class, response);
}
}
Run Code Online (Sandbox Code Playgroud)