在CXF中默认的异常处理是无法满足开发需求,经常需要把异常信息转换为JSON或者XML格式,返回给客户的,这样就只能自定义异常处理了。
在对外提供接口的时候,如果出现异常,一般会通过JSON或XML将异常码及异常信息反回给客户,这在CXF中也很容易实现。
第一步:编写自己的异常处理类 InvokeFaultExceptionMapper
@Provider
public class InvokeFaultExceptionMapper implements ExceptionMapper {
public Response toResponse(Throwable ex) {
StackTraceElement[] trace = new StackTraceElement[1];
trace[0] = ex.getStackTrace()[0];
ex.setStackTrace(trace);
ResponseBuilder rb = Response.status(Response.Status.INTERNAL_SERVER_ERROR);
rb.type("application/json;charset=UTF-8");
rb.entity(ex);
rb.language(Locale.SIMPLIFIED_CHINESE);
Response r = rb.build();
return r;
}
}
第二部:加载InvokeFaultExceptionMapper
<jaxrs:server id="expGateway" address="/expGateway">
<jaxrs:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:serviceBeans>
<ref bean="expGatewayImpl" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<jaxrs:languageMappings>
<entry key="en" value="en-gb" />
</jaxrs:languageMappings>
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
<bean class="com.pml.service.outer.InvokeFaultExceptionMapper"/>
</jaxrs:providers>
</jaxrs:server>
第三步:测试
在你的接口中跑出异常试一试,结果如下
{"operate":null,"errCode":0,"errSubCode":"err.001","cause":null,"message":"ID值异常!","localizedMessage":"ID值异常!","stackTrace":[{"className":"com.pml.service.outer.ExpGatewayImpl","fileName":"ExpGatewayImpl.java","lineNumber":59,"methodName":"getUser","nativeMethod":false}]}
二、在深入些
看到上面异常返回的接口,发现很多一部分内容是无用,真正想给客户端只有 errCode":0,"errSubCode":"err.001“ ,"message":"ID值异常!"这部分内容。那我们对异常返回的内容进行过滤一下:
第一步:修改InvokeFaultExceptionMapper.java
@Provider
public class InvokeFaultExceptionMapper implements ExceptionMapper {
public Response toResponse(Throwable ex) {
StackTraceElement[] trace = new StackTraceElement[1];
trace[0] = ex.getStackTrace()[0];
ex.setStackTrace(trace);
ResponseBuilder rb = Response.status(Response.Status.INTERNAL_SERVER_ERROR);
rb.type("application/json;charset=UTF-8");
if (ex instanceof ServiceException) {//自定义的异常类
ServiceException e = (ServiceException) ex;
ServiceExceptionEntity entity=new ServiceExceptionEntity(e.getErrCode(),e.getErrSubCode(),e.getMessage());
rb.entity(entity);
}else{
rb.entity(ex);
}
rb.language(Locale.SIMPLIFIED_CHINESE);
Response r = rb.build();
return r;
}
}
其实增加了下面这部分代码
if (ex instanceof ServiceException) {//自定义的异常类
ServiceException e = (ServiceException) ex;
ServiceExceptionEntity entity=new ServiceExceptionEntity(e.getErrCode(),e.getErrSubCode(),e.getMessage());
rb.entity(entity);
}else{
rb.entity(ex);
}
多了对自定义异常的类型判断,如果是ServiceException异常,则进行处理,非ServiceException则进行走原路。(ServiceException是系统的自定义异常类,有三个属性(int errCode,String errSubCode,String message))
添加的代码中了ServiceExceptionEntity类,该类的代码如下
public class ServiceExceptionEntity implements Serializable {
/**
* 注释内容
*/
private static final long serialVersionUID = 1L;
public ServiceExceptionEntity(){}
public ServiceExceptionEntity(int errCode, String errSubCode, String message) {
super();
this.errCode = errCode;
this.errSubCode = errSubCode;
this.message = message;
}
/*错误码,默认为0*/
private int errCode;
/*错误子码,自定义该值*/
private String errSubCode;
private String message;
public int getErrCode() {
return errCode;
}
public void setErrCode(int errCode) {
this.errCode = errCode;
}
public String getErrSubCode() {
return errSubCode;
}
public void setErrSubCode(String errSubCode) {
this.errSubCode = errSubCode;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
第二步:再在代码中抛出ServiceException异常,看下返回给客户端的代码是否为下面的几项
{"errCode":0,"errSubCode":"err.001","message":"ID值异常!","localizedMessage":"ID值异常!"}
添加的代码只对自定义的ServiceExceptino异常进行了处理,当然你还可以更多的异常处理。
- 大小: 25.4 KB
分享到:
相关推荐
当遇到不规则SOAP消息时,开发者可能需要深入理解CXF的工作原理,包括其消息模型、绑定层以及异常处理机制,以便正确地捕获和处理问题。 描述中提到的博客链接(https://huiseyiyu.iteye.com/blog/1172161)可能是...
5. **异常处理** Spring可以帮助统一处理CXF服务抛出的异常,通过配置异常处理器,将服务层的异常转化为符合Web服务标准的响应。 6. **测试** Spring Test库可以配合CXF测试框架,对服务进行单元测试和集成测试...
通过这个链接,开发者可以获取更深入的实践经验和技巧,例如如何配置CXF服务,如何处理异常,或者如何优化性能。 **源码分析** CXF的源码是开放的,这为开发者提供了一个深入理解其工作原理的机会。通过阅读源码,...
在处理CXF与JAXB的集成时,有时会遇到版本冲突的问题,特别是在处理Web服务时,这些问题可能会导致应用程序运行异常。 本文将深入探讨如何解决CXF与JAXB版本冲突,以及如何处理Java.lang.LinkageError,特别是当...
- **强大的异常处理**: CXF提供了一套完整的异常处理机制,可以帮助开发者更好地处理服务调用中的异常情况。 5. **部署与运行** - 在服务器环境中,可以使用CXF的Servlet或Jetty容器来部署Web服务,通过修改`etc/...
例如,我们可以查看消息的编码和解码过程,了解CXF如何处理异常,或者研究CXF如何加载和解析WSDL文件。 总之,Apache CXF是一个强大且灵活的Web服务框架,其源码提供了丰富的学习资源,涵盖了Web服务的各种层面。...
在CXF中,拦截器是处理消息生命周期中的关键组件,它们可以在消息发送前、接收后、发送后以及接收前执行自定义逻辑。这使得我们可以在不修改原有业务代码的情况下,轻松地添加额外的功能,如日志记录、安全检查或...
7. **错误处理和异常捕获**:WebSphere对异常处理有自己的规则,确保CXF的服务异常能够正确地被WebSphere捕捉并处理。 8. **性能优化**:根据应用的需求,可能需要调整CXF和WebSphere的性能设置,例如线程池大小、...
10. **异常处理**:通过自定义异常处理器,我们可以规范化REST服务的错误响应,提供统一的错误信息格式。 通过这个“Spring CXF Restful实例”,开发者将学习到如何在Spring环境中使用CXF构建高效、可维护的RESTful...
一旦服务被定义,CXF将自动处理服务的发布、调用以及异常处理等细节。 总结来说,Apache CXF提供了一整套工具和框架,使得开发和部署Web服务变得简单易行。它支持多种Web服务标准和模型,允许灵活的消息格式和协议...
CXF提供了一套完善的异常处理机制,允许开发者自定义错误处理策略,确保服务的稳定性和健壮性。 8. **性能优化**:对于生产环境的Web服务,性能优化是关键。CXF提供了缓存、数据压缩、多线程处理等多种优化手段,...
7. **异常处理**:学习如何在CXF中处理服务调用过程中可能出现的异常,并提供合适的错误信息。 8. **性能优化**:探讨CXF的缓存机制、数据绑定优化、以及如何调整CXF配置来提高服务性能。 9. **测试与调试**:掌握...
9. **错误处理和日志记录**:CXF提供了一套完整的错误处理机制,包括异常映射和日志记录,方便开发者调试和排查问题。 10. **性能优化**:CXF提供了缓存、流处理和异步处理等功能,以提高服务的性能和响应速度。 ...
5. **错误处理和日志记录**:CXF提供了丰富的异常处理机制和详细的日志记录,便于开发者诊断问题和调试代码。 6. **国际化和本地化**:CXF支持多语言环境,可以方便地处理不同地区的服务请求。 7. **测试支持**:...
5. **Spring AOP和事务管理**:整合CXF与Spring,可以利用Spring的AOP(面向切面编程)和事务管理功能,为Web服务添加日志、异常处理和事务控制。 6. **测试和调试**:集成后,开发者可以使用Spring的测试框架或CXF...
6. **异常处理**: - 如果在通信过程中出现任何问题,CXF会捕获并处理异常,提供相应的错误信息给调用者。 - 对于HTTP错误状态码,CXF会将其转换为特定的Web服务异常。 7. **安全机制**: - 如果服务配置了安全...
7. **异常处理**: - 源码中会包含处理服务调用异常的部分,例如,处理网络错误、服务不可用、业务逻辑错误等。 8. **日志和调试**: - CXF客户端源码可能使用了日志框架(如Log4j或SLF4J),以便记录服务调用的...
5. **异常处理**:在调用Web服务时,可能会遇到各种异常,如网络问题、服务不可用等。因此,适当的异常处理机制是必要的,通常通过try-catch语句来捕获和处理这些异常。 6. **测试和调试**:CXF提供了丰富的测试...
5. **CXF拦截器**:CXF拦截器是处理消息传递过程中的钩子,可以在消息发送前、发送后、接收前、接收后等阶段进行操作。在这个示例中,拦截器用于实现简单的授权校验。你可以定义一个实现了`ClientInterceptor`或`...
编写健壮的错误处理代码,捕获可能的异常,如文件不存在、磁盘空间不足等,并提供有意义的错误信息给客户端。同时,通过日志记录服务端的操作,以便于排查问题。 8. **测试与性能调优**: 使用单元测试和集成测试...