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
我正在使用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) 所以我的示例测试项目将显示完整的相关配置和代码:
约束注释:
@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) 我有一个带有我创建的自定义验证器的 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) 我有一个 Spring 启动应用程序。我传递给我的请求类@RestController包含javax.validation我无法更改/删除的注释 - 它们作为第三方库提供。所以我想手动验证我的请求对象或者根本不验证它们。不幸的是,如果我添加:
spring-boot-starter-validation- 预先配置Validatorbean 或validation-api并且-自己hibernate-validator创建一个ValidatorSpring 自动为我的所有 s 启用验证@RestController。
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)