我正在尝试验证包含电子邮件的 Spring Bean,但是当请求 Bean 中的电子邮件作为空字符串出现时,验证器和 BindingResult 都没有显示任何错误。\n请参阅以下代码:
\n\n豆角,扁豆:
\n\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\nimport org.springmodules.validation.bean.conf.loader.annotation.handler.Email;\nimport org.springmodules.validation.bean.conf.loader.annotation.handler.NotEmpty;\n\n@Component("grouponRedemptionFormBean")\n@Scope("prototype")\npublic class GrouponRedemptionBean {\n\n@NotEmpty(message = "Please enter your email addresss.")\n@Email(message = "Please correct your email.")\nprivate String email;\n \xe2\x80\xa6\n}\nRun Code Online (Sandbox Code Playgroud)\n\n控制器:
\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport javax.validation.Valid;\n\nimport org.apache.log4j.Logger;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.validation.BeanPropertyBindingResult;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.validation.Errors;\nimport org.springframework.validation.Validator;\nimport org.springframework.web.bind.annotation.ModelAttribute;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n\n@Controller\npublic class GrouponVoucherRedemptionController {\n\n@Autowired\n@Qualifier("defaultBeanValidator")\nprivate Validator validator;\n\n@RequestMapping(value="/groupon-redemption.ep", method=RequestMethod.POST)\npublic String PostGrouponRedemption(@Valid @ModelAttribute GrouponRedemptionBean grouponRedemptionBean, BindingResult bindingResult,\nHttpServletRequest request, HttpServletResponse response, Model model){\n\n Errors errors = new BeanPropertyBindingResult(grouponRedemptionBean, "grouponRedemptionFormBean");\n validator.validate(grouponRedemptionBean, errors);\n if(errors.hasErrors()) {\n …Run Code Online (Sandbox Code Playgroud) 我正在将Spring Boot 1.3.5与Rest Controllers一起使用,并且一切正常。
我还在官方文档中使用了Spring的验证示例技术(JSR-303 Bean验证API和Spring的验证器接口,我都尝试过并且遇到相同的问题),并且验证有效,但是我无法配置自定义消息。
我已经配置了messages.properties文件,并且可以很好地访问此文件上的消息。但是,此验证似乎无法读取或访问通过Spring Boot自动配置的我的消息源(messages.properties)。
我可以直接通过@Autowired从控制器中注入的消息源对象访问消息(代码中有注释)。但是,Spring的验证器接口或JSR-303 Bean验证的绑定结果似乎无法访问MessageSource中加载的messages.properties。我得到的结果是我的错误有代码,但没有默认消息。
这是我的应用程序类:
@SpringBootApplication
@ImportResource({ "classpath:security/cas-context.xml", "classpath:security/cas-integration.xml",
"classpath:security/security.xml" })
@EnableAutoConfiguration(exclude = VelocityAutoConfiguration.class) // http://stackoverflow.com/questions/32067759/spring-boot-starter-cache-velocity-is-missing
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public ServletRegistrationBean cxfServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/services/*");
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
@Bean
public Nfse nfseService() {
return new NfseImpl();
}
@Bean
public Endpoint …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Spring Validator 验证 POST 请求。这是我要验证的对象:
@Validated
public class Request implements Serializable {
private static final long serialVersionUID = 1L;
private Long id1;
private Long id2;
private String s;
private List<Mapping> mappings;
public Request() {}
public Request (Long id1, Long id2, String s, List<Mapping> mappings) {
this.id1 = id1;
this.id2 = id2;
this.s = s;
this.mappings = mappings;
}
//getter() and setter() methods.
}
Run Code Online (Sandbox Code Playgroud)
这是映射类:
@Validated
public class Mapping implements Serializable {
private static final long serialVersionUID = 1L;
@JsonProperty(value="id") …Run Code Online (Sandbox Code Playgroud) java spring spring-validator spring-boot spring-restcontroller
我使用 Spring 框架和 bean 验证规范(hibernate 实现)。考虑下面的代码片段,我使用以下方法进行了观察@ReportAsSingleViolation:
@ReportAsSingleViolation添加时仅返回默认消息。我的期望是触发失败的消息而不是默认消息。
当我删除@ReportAsSingleViolation注释时,一切都会按预期进行。与违反的约束相对应的所有错误消息都会正确返回。
此行为描述了 Bean 验证规范的一部分还是一个实现问题?
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
//@ReportAsSingleViolation
@NotBlank(message = "The input cannot be blank")
@Pattern(regexp = "[0-9A-Z_]+", message = "The input must content only uppercase, numbers and undescore")
@Size(max = 30, message = "The input must be maximal 30")
@Documented
public @interface MyAnnotation{
String message() default "{com.example.MyAnnotation.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
Run Code Online (Sandbox Code Playgroud) 我已经实现了Long字段和@PastOrPresent验证的验证
public class PastOrPresentValidator implements ConstraintValidator<PastOrPresent, Long>{
@Override
public boolean isValid(Long value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
return value <= System.currentTimeMillis();
}
}
public class MyDto {
@PastOrPresent
Long timestamp;
}
Run Code Online (Sandbox Code Playgroud)
并得到错误:
HV000030: No validator could be found for constraint 'javax.validation.constraints.PastOrPresent' validating type 'java.lang.Long'. Check configuration for 'push.dto.timestamp'
Run Code Online (Sandbox Code Playgroud)
但是当我创建自定义注释@PastOrPresentLong并使用相同的验证器代码时,一切正常。
有没有办法为javax.validation.constraints注释添加自定义验证器?
我写自定义注释
package ru.tinkoff.bpm.verificationcheckservice.support.validation
import org.hibernate.validator.constraints.CompositionType
import org.hibernate.validator.constraints.ConstraintComposition
import org.hibernate.validator.constraints.URL
import javax.validation.Constraint
import javax.validation.Payload
import javax.validation.ReportAsSingleViolation
import javax.validation.constraints.NotBlank
import kotlin.annotation.AnnotationRetention.RUNTIME
import kotlin.annotation.AnnotationTarget.FIELD
import kotlin.reflect.KClass
@ConstraintComposition(CompositionType.AND)
@URL
@NotBlank
@ReportAsSingleViolation
@Target(FIELD)
@Retention(RUNTIME)
@Constraint(validatedBy = [])
annotation class NotBlankUrl(
val message: String = "must be not blank and valid URL",
val groups: Array<KClass<*>> = [],
val payload: Array<KClass<out Payload>> = []
)
Run Code Online (Sandbox Code Playgroud)
我添加了 build.gradle.kts 的依赖项
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.hibernate:hibernate-validator:7.0.1.Final")
Run Code Online (Sandbox Code Playgroud)
Gradle 在报告中解决它 https://scans.gradle.com/s/ddjce3iwnldt4/dependency?dependencies=valida&expandAll&focusedDependency=WzEsOCwxNDk2LFswLDEsWzE5XV1d
但是当我启动应用程序时我看到错误
The Bean Validation API is on the classpath but no implementation could …Run Code Online (Sandbox Code Playgroud)