在特定请求的请求正文中将字段标记为必填字段

时间:2018-02-20 14:24:22

标签: spring hibernate rest hibernate-validator

我打算使用相同的bean作为请求体来创建/更新/删除配置文件(取决于请求方法)。更新有两种情况。首先是更新配置文件,其中除了emailAddress之外,可以更新firstName,lastName等任何参数,第二个仅更新emailAddress。对于第一种情况,newEmailAddress是可选的,但对于第二种情况,newEmailAddress字段是必需的。 下面是一个示例bean:

class ProfileModel {
    @NotEmpty
    @Email
    private String emailAddress;

    @Size(max=30)
    private String firstName;

    @Email
    private String newEmailAddress;

    .
    .
    .

}

我创建了不同的API端点来更新配置文件和更新电子邮件地址。我试图找到一种方法使newEmailAddress字段成为第一个请求的可选字段,并且第二个请求是必需的,但除了手动检查第二个请求的控制器方法并抛出异常之外,找不到任何东西。

有没有其他方法可以实现这一目标?

2 个答案:

答案 0 :(得分:1)

这可以使用验证组来实现。这需要一个标识符类或接口。

所以你可以这样做:

=>定义验证组标识符。它可以是一个类或接口。

public interface MyValidationGroup{}

=>在请求正文中指定验证组。

class ProfileModel {
   @NotEmpty
   @Email
   private String emailAddress;

   @Size(max=30)
   private String firstName;

   @Email
   @NotBlank(groups={MyValidationGroup.class})
   private String newEmailAddress;

    .
    .
    .

}

=>在控制器方法上指定验证组。

public ProfileModel add(@Validated({MyValidationGroup.class}) 
                              @RequestBody ProfileModel profile){
   ...
}

答案 1 :(得分:1)

验证组应该可以解决您的问题。请参阅beanvalidation.org或hibernate-validator documentation page上的示例。 基本上,您需要将一个组属性值添加到注释约束中。类似的东西:

class ProfileModel {
    @NotEmpty
    @Email
    private String emailAddress;

    @Size(max=30)
    private String firstName;

    @Email(groups= UpdateEmail.class)
    private String newEmailAddress;

然后在您的控制器上使用Springs @Validated注释,它允许您传递要验证的组。 一个端点可以使用此UpdateEmail组,另一个端点可以使用Default组。