使用自定义消息的Spring MVC回滚

时间:2016-03-21 05:36:11

标签: spring-mvc spring-transactions

我有一个Spring MVC服务方法来执行save()和update() - 两个操作。

save()成功执行后,如果我发现要更新的用户不存在,我将手动抛出一个新的RuntimeExceotion()来回滚保存操作。在这种情况下,如何将错误消息(“无法找到用户”)返回到浏览器端?

@Transactional(rollbackFor = { Exception.class })
public Map<String,Object> service(){
    Map<String,Object> map = new HashMap<String,Object>();
    //1. save user
    User user = getUser();
    this.save(user);

    //2. try to update another
    String anotherUserId = "anUserId";
    User anUser = this.getById(anotherUserId);
    if(anUser != null){
        anUser.setName("newName");
        this.update(anUser);
        map.put("status",true);
    }else{
        //logical error
        map.put("status",false);
        map.put("err_msg","cant find the user for update");        

        //triger rollback(rollback save user)
        throw new RuntimeException("update user error");
    }
    return map;
}

2 个答案:

答案 0 :(得分:0)

您可以添加包含错误消息的CustomException类。

您可以将错误消息发送回您的客户端。为此,您可以使返回类型的服务成为对象,这就是它可以发送MapErrorMessage的原因。

CustomException类看起来像这样:

public class CustomException extends Exception implements Serializable {

    public CustomException(String errorMsg)
    {
        super(errorMsg);
    }
    public CustomException(Throwable cause){
        super(cause);
    }

    public CustomException(String message ,Throwable cause){
        super(message,cause);
    }
}

你可以通过以下方式使用它:

throw new CustomException("Can not find the user");

答案 1 :(得分:0)

为什么不将错误包装在Object中,并在抛出它时将其传递给Exception。

稍后在控制器/请求 - 响应处理程序层,从Exception获取Error对象并将其传递给UI层。

Class CustomException extends Exception {

    Map<String,Object> errorMap;

    public CustomException(String errorMsg, Map errorMap)
    {
        super(errorMsg);
        this.errorMap = errorMap;
    }
    public CustomException(Throwable cause){
        super(cause);
    }

    public CustomException(String message ,Throwable cause){
        super(message,cause);
    }
}

投掷异常时:

throw new CustomException("Can not find the user", map);

在Controller End中,捕获此异常并提取包含数据的ErrorMap。 包装/转换此对象并将其传递给UI /浏览器。