最近2周,由于需要,转而研究异常。


主要心得,体会如下。全是干货。


初步要求:

1.自定义异常

2.建立异常体系结构



1.在cxf中,有一个专门抛异常的 WebApplicationException(javax.ws.rs.WebApplicationException;)作为我们自定义异常的父类。返回的类型是Response形式给Client。


import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
//import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
public class NotFoundException extends WebApplicationException {
     /**
     *
     */
    private static final long serialVersionUID = 1L;
    public NotFoundException(String message) {
         super(Response.status(Response.Status.NOT_FOUND)
             .entity(message).type(MediaType.TEXT_PLAIN_TYPE).build());
     }
}

其中的type(MediaType.TEXT_PLAIN_TYPE)其实可以不要,因为在之前的注解中已经定义了@Produces("application/json").所以影响不大。

在这个异常类中,我定义的是传递的是String。


在使用的时候

if (itemid.isEmpty() || entid.isEmpty()) {
                                                                                                                                                                                                                                            
            throw new NotFoundException("not found");
            /*
                ResponseBuilderImpl builder = new ResponseBuilderImpl(); 
                builder.status(Response.Status.NOT_FOUND); 
                builder.entity("The requested resource is not found.");
                Response response = builder.build(); 
                throw new WebApplicationException(response);
             */
        } else {
            .....
            Response.status(Status.NO_CONTENT).build();
                                                                                                                                                                                                                                            
        }


注释掉的就是刚才的自定义原形。。(说法不准确,不过效果一样。)


2.这个也只是一个大概,要根据项目模块来划分,初步设想的是将返回的entity中添加自定义的错误Errsubcode,和ErrMessage。跟据有多少模块来定义自己的Errsubcode。


遗留问题:

1.怎么精确定位到出现异常的代码?而不是大段大段的try-catch.

2.然后将出现的异常进行转译。成符合要求的异常(errsubcode添加)

//可能需要添加一个entity什么的,需要参考GenericEntity这个。目前还没用过。。