2

可能重复:
Spring MultipartFile 验证和转换

我需要检查用户是否从 jsp 页面提供了文件。

代码如下。

当我在调试模式下运行时,文件(MultiPartFile)不为空,尽管未提供该文件。

我想对所有内容使用基于注释的验证。

任何帮助,将不胜感激。

    <form:form modelAttribute="timeStampIssueParam"
        action="${pageContext['request'].contextPath}/timestamp/issue"
        method="post" enctype="multipart/form-data">
        <fieldset>
            <p>
                <form:label for="file" path="file">PDF Original</form:label>
                <br />
                <form:input path="file" type="file"/>
            </p>
            <p>



    @NotNull
    private List<MultipartFile> file

    public void issue(HttpServletResponse response, @Valid TimeStampIssueParam tsIssueParam, BindingResult result) throws JsonGenerationException, JsonMappingException, IOException {
4

1 回答 1

0

我认为没有为此目的内置验证器。因此,您需要构建自己的:

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Constraint(validatedBy = { OneFileItemValidator.class })
@Documented
public @interface OneFileItem {

    String message() default "{OneFileItem.message}";

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

    Class<? extends Payload>[] payload() default { };
}

验证者:

public class OneFileItemValidator
       implements ConstraintValidator<OneFileItem, List<MultipartFile>> {

    @Override
    public void initialize(final OneFileItem constraintAnnotation) {
    }

    @Override
    public boolean isValid(final List<MultipartFile> value, final ConstraintValidatorContext context) {

         //Ignore null values like the most other validators
         if (value == null) return true;

         int foundCounter = 0;
         for (MultipartFile multipartFile : value) {
            if (multipartFile.getSize() > 0) 
               foundCounter++);                
        }
        return foundCounter == 1;
    }
}

用法:

/** Command Object / Form Backing Class */
class TimeStampIssueParam {

    @NotNull
    @OneFileItem
    private List<MultipartFile> file;

}

我是在没有 IDE 的情况下编写的,因此其中可能存在一些语法错误。

于 2012-10-15T06:26:33.880 回答