标签: spring-validator

为什么 Spring BindingResult 或验证器不显示任何错误?

我正在尝试验证包含电子邮件的 Spring Bean,但是当请求 Bean 中的电子邮件作为空字符串出现时,验证器和 BindingResult 都没有显示任何错误。\n请参阅以下代码:

\n\n

豆角,扁豆:

\n\n
import 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

控制器:

\n\n
import 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)

java spring spring-mvc spring-validator

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

使用Spring的Validator界面进行Bean验证中的自定义消息

我正在将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)

java spring bean-validation spring-validator spring-boot

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

Spring 验证 @NotNull 不验证

我正在尝试使用 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

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

Javax注解约束@ReportAsSingleViolation

我使用 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)

java hibernate-validator bean-validation spring-validator

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

如何为`javax.validation.constraints` 注释添加自定义验证器?

我已经实现了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注释添加自定义验证器?

java bean-validation spring-validator

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

在类路径中找不到休眠验证器

我写自定义注释

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)

hibernate-validator spring-validator spring-boot

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