【问题标题】:Spring MVC, handle errors in @service layer and send them to the jspSpring MVC,在@service层处理错误并发送给jsp
【发布时间】:2012-09-10 04:12:26
【问题描述】:

我寻求在 Spring mvc 应用程序的 @service 层中处理错误验证的最佳方法。

我有一个@Controller 和一个@Service 类。

我的控制器:

public String saveProduct(Product product) {
    myService.saveProduct(product);
    return "view";
}

我的服务:

public void saveProduct(Product product) {
    // some validation here
    myDao.save(product);
}

现在假设验证导致 2 或 3 个错误(颜色不合适,供应商无法立即交付产品,等等...),我必须将它们全部显示在同一时间。

如何将这些错误传输到我的控制器,然后传输到我的 jsp?使用“错误”对象?包含所有这些错误的异常?

我已经看过这里:Passing errors back to the view from the service layer 但我找不到方便的答案。我真的必须为每个错误创建未经检查的异常吗?如果我有 20 或 30 个错误怎么办?

【问题讨论】:

  • 我会选择例外——这就是它们的用途。只需使用一些通用异常类并传入消息,即可在 JSP 中显示。无论您使用哪种方法,都需要对消息进行编码。
  • 如果我有 3 条错误消息要同时显示怎么办?我必须抛出一个包含 3 条消息的异常吗?
  • 有什么理由不使用 JSR 303 或 Spring Bean 验证?例如。 stackoverflow.com/questions/6835122/…
  • 我已经在我的控制器中使用了两者(用于表单验证,如姓名长度、电子邮件格式......)。但在服务中,我必须进行额外的控制,比如供应商可用性和其他东西)。我在问题描述中给出的链接反映了我目前的情况……但我主要关心的是如何同时显示多条消息。

标签: java validation spring-mvc service multi-layer


【解决方案1】:

最后我创建了一个自定义异常来处理功能错误:

public class ServiceException extends Exception {  
    private List<String> errors = new ArrayList<>();
    (...)
}

我还使用以下方法创建了一个 ValidationErrorsHelper 类:

public static void rejectErrors(final BindingResult result, final List<String> errors) {
    if (errors != null) {
        for (final String error : errors) {
            result.reject(error);
        }
    }
}

在我的控制器类中,我捕获了异常:

try {
    this.myService.myFunction(...);
} catch (final ServiceException e) {
    ValidationErrorsHelper.rejectErrors(result, e.getErrors());
}

这是我能找到的最好方法。如果有更好的建议,我会全力以赴!

【讨论】:

  • 我已经做了几乎相同的事情,在我的自定义异常中添加了一个包含错误标签的成员。控制器在模型中添加错误标签。然后在 jsps 中解析标签。如果您想一次返回多个错误,您的解决方案听起来要好得多。
  • 我想知道您是如何在异常对象中填写错误的?
  • 这很标准,在 ServiceException 类中你应该有像“public void addError(String error)”这样的方法。这完全取决于您的需求。
  • 不要忘记覆盖fillInStackTrace,这样你就不会...填写堆栈跟踪...stackoverflow.com/questions/11434431/…
猜你喜欢
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 2023-03-19
相关资源
最近更新 更多