`
yufenfei
  • 浏览: 802183 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CXF之五(异常处理)

 
阅读更多

     在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
分享到:
评论
1 楼 fane1157521 2013-09-18  
你好能否麻烦您把jackson的jar包给我发下,我在网上下的jar包无法使用,不知道是不是jar包版本不兼容,不胜感激!
我的邮箱是154406634@qq.com

相关推荐

    CXF处理不规则SOAP message(转)

    当遇到不规则SOAP消息时,开发者可能需要深入理解CXF的工作原理,包括其消息模型、绑定层以及异常处理机制,以便正确地捕获和处理问题。 描述中提到的博客链接(https://huiseyiyu.iteye.com/blog/1172161)可能是...

    CXF源码:CXF_Spring源码

    5. **异常处理** Spring可以帮助统一处理CXF服务抛出的异常,通过配置异常处理器,将服务层的异常转化为符合Web服务标准的响应。 6. **测试** Spring Test库可以配合CXF测试框架,对服务进行单元测试和集成测试...

    CXF

    通过这个链接,开发者可以获取更深入的实践经验和技巧,例如如何配置CXF服务,如何处理异常,或者如何优化性能。 **源码分析** CXF的源码是开放的,这为开发者提供了一个深入理解其工作原理的机会。通过阅读源码,...

    CXF-JAXB包的处理问题

    在处理CXF与JAXB的集成时,有时会遇到版本冲突的问题,特别是在处理Web服务时,这些问题可能会导致应用程序运行异常。 本文将深入探讨如何解决CXF与JAXB版本冲突,以及如何处理Java.lang.LinkageError,特别是当...

    apache-cxf-3.5.0.zip

    - **强大的异常处理**: CXF提供了一套完整的异常处理机制,可以帮助开发者更好地处理服务调用中的异常情况。 5. **部署与运行** - 在服务器环境中,可以使用CXF的Servlet或Jetty容器来部署Web服务,通过修改`etc/...

    cxf-core-3.2.4_cxf_源码

    例如,我们可以查看消息的编码和解码过程,了解CXF如何处理异常,或者研究CXF如何加载和解析WSDL文件。 总之,Apache CXF是一个强大且灵活的Web服务框架,其源码提供了丰富的学习资源,涵盖了Web服务的各种层面。...

    CXF WebService带有拦截器

    在CXF中,拦截器是处理消息生命周期中的关键组件,它们可以在消息发送前、接收后、发送后以及接收前执行自定义逻辑。这使得我们可以在不修改原有业务代码的情况下,轻松地添加额外的功能,如日志记录、安全检查或...

    在WebSphere发布CXF注意事项

    7. **错误处理和异常捕获**:WebSphere对异常处理有自己的规则,确保CXF的服务异常能够正确地被WebSphere捕捉并处理。 8. **性能优化**:根据应用的需求,可能需要调整CXF和WebSphere的性能设置,例如线程池大小、...

    Spring CXF Restful 实例

    10. **异常处理**:通过自定义异常处理器,我们可以规范化REST服务的错误响应,提供统一的错误信息格式。 通过这个“Spring CXF Restful实例”,开发者将学习到如何在Spring环境中使用CXF构建高效、可维护的RESTful...

    用cxf开发webservice

    一旦服务被定义,CXF将自动处理服务的发布、调用以及异常处理等细节。 总结来说,Apache CXF提供了一整套工具和框架,使得开发和部署Web服务变得简单易行。它支持多种Web服务标准和模型,允许灵活的消息格式和协议...

    cxf WebService

    CXF提供了一套完善的异常处理机制,允许开发者自定义错误处理策略,确保服务的稳定性和健壮性。 8. **性能优化**:对于生产环境的Web服务,性能优化是关键。CXF提供了缓存、数据压缩、多线程处理等多种优化手段,...

    cxf教程(word)

    7. **异常处理**:学习如何在CXF中处理服务调用过程中可能出现的异常,并提供合适的错误信息。 8. **性能优化**:探讨CXF的缓存机制、数据绑定优化、以及如何调整CXF配置来提高服务性能。 9. **测试与调试**:掌握...

    cxf-3.0.0 zip

    9. **错误处理和日志记录**:CXF提供了一套完整的错误处理机制,包括异常映射和日志记录,方便开发者调试和排查问题。 10. **性能优化**:CXF提供了缓存、流处理和异步处理等功能,以提高服务的性能和响应速度。 ...

    cxf-3.1.6的所需要的包

    5. **错误处理和日志记录**:CXF提供了丰富的异常处理机制和详细的日志记录,便于开发者诊断问题和调试代码。 6. **国际化和本地化**:CXF支持多语言环境,可以方便地处理不同地区的服务请求。 7. **测试支持**:...

    CXF之一 (与Spring整合)

    5. **Spring AOP和事务管理**:整合CXF与Spring,可以利用Spring的AOP(面向切面编程)和事务管理功能,为Web服务添加日志、异常处理和事务控制。 6. **测试和调试**:集成后,开发者可以使用Spring的测试框架或CXF...

    CXF客户端启动过程

    6. **异常处理**: - 如果在通信过程中出现任何问题,CXF会捕获并处理异常,提供相应的错误信息给调用者。 - 对于HTTP错误状态码,CXF会将其转换为特定的Web服务异常。 7. **安全机制**: - 如果服务配置了安全...

    验证客户端源码cxf

    7. **异常处理**: - 源码中会包含处理服务调用异常的部分,例如,处理网络错误、服务不可用、业务逻辑错误等。 8. **日志和调试**: - CXF客户端源码可能使用了日志框架(如Log4j或SLF4J),以便记录服务调用的...

    CXF实例源代码(客户端)

    5. **异常处理**:在调用Web服务时,可能会遇到各种异常,如网络问题、服务不可用等。因此,适当的异常处理机制是必要的,通常通过try-catch语句来捕获和处理这些异常。 6. **测试和调试**:CXF提供了丰富的测试...

    springBoot完整整合WebService框架CXF示例

    5. **CXF拦截器**:CXF拦截器是处理消息传递过程中的钩子,可以在消息发送前、发送后、接收前、接收后等阶段进行操作。在这个示例中,拦截器用于实现简单的授权校验。你可以定义一个实现了`ClientInterceptor`或`...

    CXF之二(上传及下载附件)

    编写健壮的错误处理代码,捕获可能的异常,如文件不存在、磁盘空间不足等,并提供有意义的错误信息给客户端。同时,通过日志记录服务端的操作,以便于排查问题。 8. **测试与性能调优**: 使用单元测试和集成测试...

Global site tag (gtag.js) - Google Analytics