【问题标题】:Handling MultiException of jersey处理球衣的MultiException
【发布时间】:2015-03-04 15:35:22
【问题描述】:

我们如何处理包含 Throwable 对象列表的球衣MultiException

异常映射器技术在一个异常的情况下工作正常,但我如何处理多个异常?

【问题讨论】:

  • 为清晰起见重新措辞。

标签: java exception-handling jersey-2.0


【解决方案1】:

您可以通过在 MultiException 上调用 getErrors() 来获取异常列表。 MultiException类中定义的方法是:

public List<Throwable> getErrors() {
    synchronized (this.lock) {
        return Collections.unmodifiableList(this.throwables);
    }
}

在您的映射器中,您可以使用此列表来创建错误响应。下面是一个简单的映射器类,可以用来处理MultiException中的所有异常:

public class MultiExceptionMapper implements ExceptionMapper<MultiException>{    
    private static final String TYPE="ERROR";
    private static final Status ERROR_STATUS=Status.INTERNAL_SERVER_ERROR;

    @Override
    public Response toResponse(MultiException exception) {      
        List<MyResponseError> myErrors=  new ArrayList<>();
        for (Throwable throwable:exception.getErrors()){
            MyResponseError error = new MyResponseError(throwable.getMessage());
            error.setType(TYPE);
            myErrors.add(error);
        }
        Status errorStatus = ERROR_STATUS;      
        ErrorsDTO errors = new ErrorsDTO(errorStatus,myErrors);     
        return errors.generateResponse();   
    }
}

错误响应由此 ErrorsDTO 类生成:

@XmlRootElement    
public class ErrorsDTO extends ResponseDTO {        
    private List<MyResponseError> errors;   
    private String status="ERROR";
    private transient Status errorStatus=Status.NOT_FOUND;  
    private int errorCode;

    /**
     * Default constructor is required to support serialization/deserialization
     */
    public ErrorsDTO(){

    }
    /**
     * If status is not provided set status as NOT_FOUND
     * @param error
     */
    public ErrorsDTO(MyResponseError error){
        this(Status.NOT_FOUND,error);
    }
    public ErrorsDTO(Status errorStatus, MyResponseError error){
        List<MyResponseError> errors = new ArrayList<>();
        errors.add(error);
        this.errorStatus= errorStatus;
        this.errors =errors;
    }
    public ErrorsDTO(List<MyResponseError> errors){
        this(Status.NOT_FOUND,errors);
    }

    public ErrorsDTO(Status errorStatus, List<MyResponseError> errors){
        if(errors==null){
            errors = new ArrayList<>();
        }
        this.errorStatus = errorStatus;
        this.errors = errors;
    }

    @Override
    public Response generateResponse() {
        if(this.errorStatus==null){
            this.errorStatus= Status.NOT_FOUND;
        }
        this.errorCode= this.errorStatus.getStatusCode();

        ResponseBuilder builder = Response.status(errorStatus); 
        builder.entity(this);
        builder.type(MediaType.APPLICATION_JSON);
        Response response = builder.build();
        return response;
    }
    @XmlElement(name="errors")
    public List<MyResponseError> getErrors() {
        return errors;
    }
    public void setErrors(List<MyResponseError> errors) {
        this.errors = errors;
    }
    @XmlElement
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    @XmlTransient
    public Status getErrorStatus() {
        return errorStatus;
    }
    public void setErrorStatus(Status errorStatus) {
        this.errorStatus = errorStatus;
    }
    @XmlElement
    public int getErrorCode() {
        return errorCode;
    }
    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }
}

【讨论】:

  • 但是,我必须尝试捕获每个异常并为它们创建错误响应。就没有别的办法了吗?
  • 您想为 MultiException 创建错误响应吗?我为该用例添加了一个简单的实现。
猜你喜欢
  • 2015-07-09
  • 1970-01-01
  • 2023-03-26
  • 2016-01-03
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多