相关疑难解决方法(0)

JSR-303依赖注入和Hibernate

Spring 3.0.2,Hibernate 3.5.0,Hibernate-Validator 4.0.2.GA

我试图使用以下方法将Spring依赖项注入ConstraintValidator:

@PersistenceContext
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)

我已经配置了应用程序上下文:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
Run Code Online (Sandbox Code Playgroud)

根据Spring文档,应该允许"自定义ConstraintValidators像其他任何Spring bean一样受益于依赖注入"

在调试器中,我可以看到Spring调用getBean来创建ConstraintValidator.稍后当flush触发preInsert时,会创建并调用另一个ConstraintValidator.问题是EntityManager在这个新的ConstraintValidator中是null.我尝试在ConstraintValidator中注入其他依赖项,这些依赖项始终为null.

有谁知道是否有可能将依赖注入ConstraintValidator?

validation spring hibernate dependency-injection bean-validation

9
推荐指数
3
解决办法
1万
查看次数

在Spring Boot Data REST中进行实体验证后运行@HandleBeforeCreate

我正在使用Spring Boot Data REST来保存我的User实体

@Entity
public class User {

    @Id
    @GeneratedValue
    private long id;

    @NotEmpty
    private String firstName;

    @NotEmpty
    private String lastName;

    @NotEmpty
    private String email;

    @Size(min = 5, max = 20)
    private String password;

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

使用存储库:

public interface UserRepository extends CrudRepository<User, Long> {}
Run Code Online (Sandbox Code Playgroud)

我想要做的是首先验证POSTed用户:

@Configuration
public class CustomRestConfiguration extends SpringBootRepositoryRestMvcConfiguration {

    @Autowired
    private Validator validator;

    @Override
    protected void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
        validatingListener.addValidator("beforeCreate", validator);
    }

}
Run Code Online (Sandbox Code Playgroud)

并且只有在将用户密码存储到数据库之前才对其进行哈希处理:

@Component
@RepositoryEventHandler(User.class)
public class UserRepositoryEventHandler …
Run Code Online (Sandbox Code Playgroud)

java validation spring spring-data-rest

9
推荐指数
1
解决办法
1942
查看次数

使用Spring的JSR-303约束验证器中的依赖注入失败

我和这里这里有同样的问题,但还没有找到解决方案.

所以我的示例测试项目将显示完整的相关配置和代码:

约束注释:

@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = FooValidator.class)
public @interface FooValid {

    String message();

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
Run Code Online (Sandbox Code Playgroud)

注释PoJo:

public class Foo {

    @FooValid(message = "Test failed")
    private Integer test;
    [...]
}
Run Code Online (Sandbox Code Playgroud)

使用@Validated进行带注释的服务:

@Service
@Validated
public class FooService {

    private final Test test;

    @Autowired
    public FooService(final Test test) {
        this.test = test;
    }

    public void foo(@Valid final Foo foo) {
        this.test.test(foo);
    }
}
Run Code Online (Sandbox Code Playgroud)

JSR-303 ConstraintValidator:

public …
Run Code Online (Sandbox Code Playgroud)

validation spring dependency-injection

8
推荐指数
2
解决办法
8272
查看次数

Spring Boot自定义验证器运行两次

我有一个带有我创建的自定义验证器的 Spring Boot 应用程序,与此处描述的非常相似:

如何在 Spring Boot 项目中禁用 Hibernate 验证

我已经尝试了建议的解决方案,这意味着我将以下行添加到application.properties文件中:

spring.jpa.properties.javax.persistence.validation.mode=none

这是代码(部分):

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;


@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = ReCaptchaResponseValidator.class)
public @interface ReCaptchaResponse {
   String message() default "RECAPTCHA_RESPONSE_INVALID";

   Class<?>[] groups() default {};

   Class<? extends Payload>[] payload() default {};
 }
Run Code Online (Sandbox Code Playgroud)

然后我有:

import org.json.JSONObject;
import org.springframework.stereotype.Component;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.Charset;


public class ReCaptchaResponseValidator implements 
ConstraintValidator<ReCaptchaResponse, String> {
private …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa bean-validation spring-boot

5
推荐指数
1
解决办法
1749
查看次数

Spring中是否可以禁用自动验证

我有一个 Spring 启动应用程序。我传递给我的请求类@RestController包含javax.validation我无法更改/删除的注释 - 它们作为第三方库提供。所以我想手动验证我的请求对象或者根本不验证它们。不幸的是,如果我添加:

  • spring-boot-starter-validation- 预先配置Validatorbean 或
  • validation-api并且-自己hibernate-validator创建一个Validator

Spring 自动为我的所有 s 启用验证@RestController

Spring中是否可以禁用自动验证?

validation spring spring-boot

5
推荐指数
0
解决办法
2882
查看次数

验证器的 Spring 单元测试问题

我正在尝试为我拥有的验证器类编写单元测试。因此,在我的 UniqueEmailValidator 类中,我注入了一个 @Service 组件来检查它是否存在。

@AllArgsConstructor
public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {
    
    private final AccountService accountService;
    
    @Override
    public void initialize(final UniqueEmail constraintAnnotation) {
    }

    @Override
    public boolean isValid(final String email, final ConstraintValidatorContext context) {
        return !this.accountService.findByEmail(email).isPresent();
    }
}

@Documented
@Target({TYPE, FIELD, ANNOTATION_TYPE}) 
@Retention(RUNTIME)
@Constraint(validatedBy = UniqueEmailValidator.class)
public @interface UniqueEmail {
    
    String message() default "{com.x.x.validator.UniqueEmail.message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
Run Code Online (Sandbox Code Playgroud)

我尝试为这个约束验证器编写单元测试。

@RunWith(SpringRunner.class)
@DataJpaTest
public class AccountValidatorTest {
    
    private static Validator validator;

    @BeforeClass
    public static …
Run Code Online (Sandbox Code Playgroud)

java validation junit spring spring-boot

4
推荐指数
1
解决办法
4996
查看次数