Spring:有没有内置的方法来提升服务层中的jsr303验证异常?

时间:2016-10-08 00:32:43

标签: java spring validation

我有一个带有jsr 303注释和服务的模型

public class User {
    @NotNull
    @Size(min = 2)
    private String username;

    @NotNull 
    private String email;

    ... 
}

@Component
public class UserServiceImpl extends UserService {

     public void createNewUser(@Valid User user) {
         ...
     } 
}

每当我在此服务上调用方法时,是否有任何内置方法可以引发验证异常(如果有的话),例如在Controller层中?

...
userService->createNewUser(user) <- Here I want validation exceptions to be thrown
...
P.S:我可以用弹簧AOP做到,但我想知道是否有建造方式。

1 个答案:

答案 0 :(得分:0)

问题出在Spring中,验证与控制器集成在一起,因此验证消息会传播回视图,您会看到类似以下内容:电子邮件文本框旁边的无效电子邮件。当你有提交,更新和删除的约束时,使用的另一个地方验证是持久性。如果违反了相应的验证约束,则无法执行这些操作。

很明显,控制器会在您的视图中显示错误,并且在验证失败时DAO不会提交到您的数据库。那么您期望在服务层中发生什么?我只能想到如果你用不正确的参数调用一个方法,你会想要抛出异常。我猜你可以像你已经知道的那样使用面向方面编程来抛出异常,这样就可以了。

但我认为没有人认为在此级别进行参数验证太有用了,因为您无法在视图中对请求参数进行验证时自动将其显示在视图上控制器。最好在控制器中找到这些违规行为,以便用户可以在视图中看到这些违规行为。

如果你选择沿着方面路径走,那么你可以捕获这些异常并用ControllerAdvice显示某个页面,所以在某种程度上你可以将异常集成到这个视图中,尽管它从未真正发生过对我这样做,但你可能会觉得这很有帮助,只是你可能在服务中的服务中服务,参数可能对提出初始请求的用户没有多大意义。

但总的来说,如果可以,最简单的方法是在控制器中进行此验证。