1

假设我有一个具有强制属性“名称”和可选属性“电子邮件”的模型 Bean“供应商”。

class Vendor {

    @Email
    private String email;

    @NotNull
    private String name;

}

@Email 允许 Null!

我也想@Controller在我的流程和流程中使用休眠验证。在这两种情况下,我都有一个问题,即带有空电子邮件字段的已发布表单与“”绑定而不是 NULL。

StringTrimmerEditor似乎通过将“”转换为NULL来解决我的问题。对于我来说@Controller,我发现SPR-7077建议StringTrimmerEditor使用@ControllerAdvice. 但这不适用于我的流程。

如何实现将全局空字符串(“”)转换为 NULL 以在 spring webflow 中进行 JSR-303 验证?

4

2 回答 2

1

我似乎找到了一个支持空字符串的 Null 值的配置。对于我的@Controller,我坚持使用StringTrimmerEditor我的@ControllerAdvice. 这里没有什么新鲜事。

对于 SWFConversionService似乎可以解决问题:首先,我创建一个Converter将 "" 转换为 Null 的方法:

public class StringToNullConverter implements Converter<String, String> {

    @Override
    public String convert(String source) {
        if (StringUtils.isEmpty(source)) {
            return null;

        }
        return source;
    }

}

现在我必须在 Spring 中注册:

import org.springframework.core.convert.*;

@Configuration
public class SpringConfiguration {

    @Bean public ConversionService conversionService() {
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();        
        conversionService.addConverter(new StringToNullConverter());
        return conversionService;
    }

}

到目前为止,没有任何新的事情发生,我们正在谈论org.springframework.core.convert包。现在将 SWF 胶水放入org.springframework.binding.convert包装中:

import org.springframework.binding.convert.*;

@Bean public ConversionService flowConversionService(org.springframework.core.convert.ConversionService conversionService) {
    DefaultConversionService service = new DefaultConversionService(conversionService);
    return service;
}

使用 .将其连接到 SWF 中 <webflow:flow-builder-services [..] conversion-service="flowConversionService" />

这看起来有点太多了,但它确实完成了工作。我确信一定有更好的方法,因为我有两种不同的实现(StringTrimmerEditorStringToNullConverter)来实现相同的目标。对我来说,这ConversionService似乎是唯一的方法。但我不知道如何为 Spring 完成它@Controller

于 2013-10-27T13:59:27.153 回答
0

@ConstraintComposition如果您想使用可选字段,您可以创建注释包含。例如:

import org.hibernate.validator.constraints.ConstraintComposition;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
@ConstraintComposition
@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = {})
@Documented

@NotBlank
@Length(min = 1, max = 5)
@Pattern(regexp = "[A-Z]*")
public @interface SpecialField {
    String message() default "{}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

@ConstraintComposition(OR)
@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = {})
@Documented

@Null
@SpecialField
public @interface OptionalSpecialField {

    String message() default "{}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

在该标记可选之后提交:

class NewUser {

    @OptionalSpecialField
    private String firstName;

    @SpecialField
    private String lastName;

    @Min(18)
    private Integer age;
}

名字不是必需的,但如果不为空,则必须不为空,匹配模式等。

所有示例都在这里:https ://github.com/lukaszguz/optional-field-validation/tree/master/src/main/java/pl/guz/domain/validation

于 2017-06-06T15:35:32.173 回答