`
yufenfei
  • 浏览: 797727 次
  • 性别: 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处理复杂类型

    CXF处理复杂类型,关于接口的处理,这里是从网上搜索整理的资料,看看吧

    使用cxf webservice时容易出现的异常

    使用cxf webservice时容易出现的异常

    实战Web Service 之CXF

    实战Web Service 之 CXF 实战Web Service 之 CXF

    CXF-JAXB包的处理问题

    处理cxf版本和jaxb包中冲突问题,解决webservice中遇到的版本问题

    apache-cxf-2.7.7

    CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载 CXF下载

    CXF源码:CXF_Spring源码

    CXF源码:CXF_Spring源码 CXF源码:CXF_Spring源码

    WebService之CXF开发指南

    WebService之CXF开发指南WebService之CXF开发指南WebService之CXF开发指南

    cxf-3.1.5 和 cxf-3.3.13 JAVA7和JAVA8对应CXF资源

    JAVA7和JAVA8对应CXF资源 WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- ...

    webservice框架之CXF-详细技术参考

    Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且...

    Spring CXF Restful 实例

    Spring CXF Restful 实例

    04.使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值

    04.使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值

    cxf源代码,样例,cxfdemo

    cxf服务端开发

    CXF(Webservice)开发手册

    CXF Webservice 开发手册

    用cxf开发webservice

    Apache CXF是一个开源的Service框架,它实现了JCP与Web Service中一些重要标准。CXF简化了构造,集成,面向服务架构(SOA)业务组件与技术的灵活复用。在CXF中,Service使用WSDL标准定义并能够使用各种不同的消息格式...

    cxf的jar包.rar

    利用Apache CXF开发webservice接口需要用到的jar集合 cxf-core-3.0.15.jar cxf-rt-bindings-soap-3.0.15.jar cxf-rt-bindings-xml-3.0.15.jar cxf-rt-databinding-jaxb-3.0.15.jar cxf-rt-frontend-jaxws-3.0.15.jar...

    Cxf转换器示例

    Web Service Cxf转换器的示例,包含源码和jar包。

    cxf.xml,cxf-servlet.xml,cxf-extension-soap.xml

    &lt;import resource="classpath:META-INF/cxf/cxf.xml"/&gt; &lt;import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/&gt; &lt;import resource="classpath:META-INF/cxf/cxf-servlet.xml"/&gt;

    cxf3.1.18.rar

    spring 4.2.0 集成的cxf3.1.18的jar包,cxf-core-3.1.18.jar、cxf-rt-bindings-soap-3.1.18.jar、cxf-rt-databinding-jaxb-3.1.18.jar、cxf-rt-frontend-jaxws-3.1.18.jar、cxf-rt-frontend-simple-3.1.18.jar、cxf-...

    CXF简介与功能

    CXF采用的是Spring2.0提供的一个新接口就是扩展的NamespaceHandler。通过注册相关的NamespaceHandler以及xsd,在Spring处理到对应Namespace下的XML元素时将会调用NamespaceHandler中注册的Parser来进行处理。

    apache-cxf-3.0.4

    Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、...

Global site tag (gtag.js) - Google Analytics