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

Marking a field as mandatory in the request body for a specific request

我打算使用相同的 bean 作为 creating/updating/deleting 配置文件的请求主体(取决于请求方法)。更新有两种情况。首先是更新配置文件,其中可以更新除电子邮件地址之外的任何参数,如名字、姓氏等,第二个是仅更新电子邮件地址。对于第一种情况,newEmailAddress 是可选的,但对于第二种情况,newEmailAddress 字段是必需的。 下面是一个示例 bean:

class ProfileModel {
    @NotEmpty
    @Email
    private String emailAddress;

    @Size(max=30)
    private String firstName;

    @Email
    private String newEmailAddress;

    .
    .
    .

}

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

还有其他方法可以实现吗?

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

所以你可以这样做:

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

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){
   ...
}

验证组应该可以解决您的问题。请参阅 beanvalidation.org or at 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 组。