spring - Java : GroupSequenceProvider for Validation, 对象在 getValidationGroups 方法中为空

标签 spring hibernate validation spring-mvc spring-boot

这就是我要实现的目标: 我有一个更新请求对象,允许用户进行部分更新。但我只想验证该字段是否在请求正文中。否则,可以为空。为此,我使用 GroupSequenceProvider 让 validator 知道要验证哪些组。我在这里做错了什么?如果有错误,我该如何解决?

文档:https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/chapter-groups.html#example-implementing-using-default-group-sequence-provider

@GroupSequenceProvider(UpdateUserRegistrationGroupSequenceProvider.class)
public class UpdateUserRegistrationRequestV1 {

@NotBlank(groups = {EmailExistsInRequest.class})
@Email(groups = {EmailExistsInRequest.class})
@SafeHtml(whitelistType = SafeHtml.WhiteListType.NONE, groups = {EmailExistsInRequest.class})
private String email;

@NotNull(groups = {PasswordExistsInRequest.class})
@Size(min = 8, max = 255, groups = {PasswordExistsInRequest.class})
private String password;

@NotNull(groups = {FirstNameExistsInRequest.class})
@Size(max = 255, groups = {FirstNameExistsInRequest.class})
@SafeHtml(whitelistType = SafeHtml.WhiteListType.NONE, groups = {FirstNameExistsInRequest.class})
private String firstName;

// THERE ARE GETTERS AND SETTERS BELOW
}

组序列提供者代码:

public class UpdateUserRegistrationGroupSequenceProvider implements DefaultGroupSequenceProvider<UpdateUserRegistrationRequestV1> {

public interface EmailExistsInRequest {}

public interface PasswordExistsInRequest {}

public interface FirstNameExistsInRequest {}

@Override
public List<Class<?>> getValidationGroups(UpdateUserRegistrationRequestV1 updateUserRegistrationRequestV1) {
    List<Class<?>> defaultGroupSequence = new ArrayList<Class<?>>();
    defaultGroupSequence.add(Default.class);
    defaultGroupSequence.add(UpdateUserRegistrationRequestV1.class);

    if(StringUtils.hasText(updateUserRegistrationRequestV1.getEmail())) {
        defaultGroupSequence.add(EmailExistsInRequest.class);
    }

    if(StringUtils.hasText(updateUserRegistrationRequestV1.getPassword())) {
        defaultGroupSequence.add(PasswordExistsInRequest.class);
    }

    if(StringUtils.hasText(updateUserRegistrationRequestV1.getFirstName())) {
        defaultGroupSequence.add(FirstNameExistsInRequest.class);
    }

    return defaultGroupSequence;
}
}

我正在使用 Spring MVC,所以这就是我的 Controller 方法的样子,

    @RequestMapping(value = "/{userId}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void updateUser(@PathVariable("userId") Long userId,
                       @RequestBody @Valid UpdateUserRegistrationRequestV1 request) {

    logger.info("Received update request = " + request + " for userId = " + userId);

    registrationService.updateUser(userId, conversionService.convert(request, User.class));
}

现在的问题是,UpdateUserRegistrationGroupSequenceProvider.getValidationGroups 方法中的参数“updateUserRegistrationRequestV1”为空。这是我在请求正文中发送的请求对象,我正在发送电子邮件字段。

我做错了什么?

最佳答案

我也遇到了同样的问题,希望能解决

您只需检查对象是否为 null 并将所有条件放入其中。

public List<Class<?>> getValidationGroups(Employee object) {
        List<Class<?>> sequence = new ArrayList<>();
        //first check if the object is null
        if(object != null ){
             if (!object.isDraft()) {
                    sequence.add(Second.class);
                }
        }


        // Apply all validation rules from default group
        sequence.add(Employee.class);

        return sequence;
    }

关于spring - Java : GroupSequenceProvider for Validation, 对象在 getValidationGroups 方法中为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30359124/

相关文章:

java - 无法解析匹配的构造函数

javascript - 在验证模式中使用 isStrongPassword

ruby-on-rails - 使用backbone.js 和Ruby on Rails 进行验证

Spring - 使用Builder模式注入(inject)bean

java - 结合 DispatcherServlet、ContextLoaderListener 和 SpringSecurity

java - 错误 java.lang.IllegalArgumentException : Invalid token character '/' in token "multipart/form-data"

hibernate - micronaut 是否有一种方法可以让 "Spring Data JPA"存储库像 spring 一样从界面自动生成?

javascript - 使用 Joi 浏览器进行异或验证

java - 使用 DataJpaTest spring boot 2.1.0 更新失败

java - 刷新 JpaRepository 中的 saveAll