簡體   English   中英

使用Java配置進行Spring MVC Bean驗證

[英]Spring MVC Bean Validation with Java Configuration

我正在為Spring MVC使用Java配置。 我無法使Bean驗證正常工作。 我有一個已注釋的域類,並且想在Controller中使用@Valid 我知道使用XML配置時,我將以這種方式設置驗證器<mvc:annotation-driven validator="validator"/>

如何使用Java配置執行此操作。 我沒有收到任何錯誤,驗證只是行不通。 提前致謝!

這是我的設置:

帶有注釋的域類:

public class Product {

    @Pattern(regexp="P[1-9]+", message="{Pattern.Product.productId.validation}")
    @ProductId 
    private String productId;

    @Size(min=4, max=50, message="{Size.Product.name.validation}")
    private String name;

    @Min(value=0, message="Min.Product.unitPrice.validation}")
    @Digits(integer=8, fraction=2, message="{Digits.Product.unitPrice.validation}")
    @NotNull(message= "{NotNull.Product.unitPrice.validation}")
    private BigDecimal unitPrice;
    private String description;
    private String manufacturer;
    private String category;
    private long unitsInStock;

這是我使用@Valid的控制器:

@Controller
@RequestMapping("/products")
public class ProductController {

..... (shortened)

@RequestMapping(value = "/add", method = RequestMethod.GET)
    public String getAddNewProductForm(@ModelAttribute("newProduct") Product newProduct) {
       return "addProduct";
    }

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String processAddNewProductForm(@ModelAttribute("newProduct") @Valid Product productToBeAdded, BindingResult result, HttpServletRequest request) {
        if(result.hasErrors()) {
            return "addProduct";
        }

        String[] suppressedFields = result.getSuppressedFields();

        if (suppressedFields.length > 0) {
            throw new RuntimeException("Attempting to bind disallowed fields: " + StringUtils.arrayToCommaDelimitedString(suppressedFields));
        }

        MultipartFile productImage = productToBeAdded.getProductImage();
        String rootDirectory = request.getSession().getServletContext().getRealPath("/");

            if (productImage!=null && !productImage.isEmpty()) {
               try {
                productImage.transferTo(new File(rootDirectory+"resources\\images\\"+productToBeAdded.getProductId() + ".png"));
               } catch (Exception e) {
                throw new RuntimeException("Product Image saving failed", e);
           }
           }


        productService.addProduct(productToBeAdded);
        return "redirect:/products";
    }

這是我的@EnableWebMVC的Config類:( ***更新為獲取驗證器***

@SuppressWarnings("deprecation")
@Configuration
@ComponentScan(basePackages = {"com.nam.webstore"})
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

..... (shortened)

    @Bean(name = "validator")
    public LocalValidatorFactoryBean localValidatorFactoryBean() {
        LocalValidatorFactoryBean lvfb = new LocalValidatorFactoryBean();

        lvfb.setValidationMessageSource(resourceBundleMessageSource());

        return lvfb;
    }

    (***** Updated *****)
    @Override
    public Validator getValidator() {
        return localValidatorFactoryBean();
    }
}

這是帶有錯誤標記的jsp:

..... (shortened)

<section class="container">
    <form:form  modelAttribute="newProduct" class="form-horizontal" enctype="multipart/form-data">
        <fieldset>
            <legend>Add new product</legend>

            <form:errors path="*" cssClass="alert alert-danger" element="div"/>
            <div class="form-group">
                <label class="control-label col-lg-2 col-lg-2" for="productId"><spring:message code="addProduct.form.productId.label"/></label>
                <div class="col-lg-10">
                    <form:input id="productId" path="productId" type="text" class="form:input-large"/>
                    <form:errors path="productId" cssClass="text-danger"/>
                </div>
            </div>

            <div class="form-group">
                <label class="control-label col-lg-2" for="name"><spring:message code="addProduct.form.name.label"/></label>
                <div class="col-lg-10">
                    <form:input id="name" path="name" type="text" class="form:input-large"/>
                    <form:errors path="name" cssClass="text-danger"/>
                </div>
            </div>

            <div class="form-group">
                <label class="control-label col-lg-2" for="unitPrice"><spring:message code="addProduct.form.unitPrice.label"/></label>
                <div class="col-lg-10">
                    <div class="form:input-prepend">
                        <form:input id="unitPrice" path="unitPrice" type="text" class="form:input-large"/>
                        <form:errors path="unitPrice" cssClass="text-danger"/>
                    </div>
                </div>
            </div>

            <div class="form-group">
                <label class="control-label col-lg-2" for="description"><spring:message code="addProduct.form.description.label"/></label>
                <div class="col-lg-10">
                    <form:textarea id="description" path="description" rows = "2"/>
                </div>
            </div>

更新 將Logger設置為DEBUG之后,這就是我在控制台中看到的內容。 我可以看到它正在啟動驗證,但是我不知道為什么要向DispatcherServlet返回null? 我要返回視圖名稱。

字段“ unitPrice”上對象“ newProduct”中的字段錯誤:拒絕的值[null]; 代碼[NotNull.newProduct.unitPrice,NotNull.unitPrice,NotNull.java.math.BigDecimal,NotNull]; 參數[org.springframework.context.support.DefaultMessageSourceResolvable:代碼[newProduct.unitPrice,unitPrice]; 參數[]; 默認消息[unitPrice]]; 默認消息[單價無效。 它不能為空。]字段'productId'上的對象'newProduct'中的字段錯誤:拒絕的值[]; 代碼[Pattern.newProduct.productId,Pattern.productId,Pattern.java.lang.String,Pattern]; 參數[org.springframework.context.support.DefaultMessageSourceResolvable:代碼[newProduct.productId,productId]; 參數[]; 默認消息[productId],[Ljavax.validation.constraints.Pattern $ Flag; @ 3641ef8a,P [1-9] +]; 默認消息[無效的產品ID。 它應以字符P開頭,后跟數字。]字段“名稱”上的對象“ newProduct”中的字段錯誤:拒絕的值[]; 代碼[Size.newProduct.name,Size.name,Size.java.lang.String,Size]; 參數[org.springframework.context.support.DefaultMessageSourceResolvable:代碼[newProduct.name,name]; 參數[]; 默認消息[名稱],50,4]; 默認消息[無效的產品名稱。 它應至少為4個字符,最多為50個字符。] 2014-07-25 15:03:36 DEBUG ResponseStatusExceptionResolver:134-解決處理程序中的異常[公共java.lang.String com.nam.webstore.controller.ProductController.processAddNewProductForm (com.nam.webstore.domain.Product,org.springframework.ui.ModelMap,org.springframework.validation.BindingResult,javax.servlet.http.HttpServletRequest)]:org.springframework.validation.BindException:org.springframework.validation .BeanPropertyBindingResult:3個錯誤字段'unitPrice'上的對象'newProduct'中的字段錯誤:拒絕的值[null]; 代碼[NotNull.newProduct.unitPrice,NotNull.unitPrice,NotNull.java.math.BigDecimal,NotNull]; 參數[org.springframework.context.support.DefaultMessageSourceResolvable:代碼[newProduct.unitPrice,unitPrice]; 參數[]; 默認消息[unitPrice]]; 默認消息[單價無效。 它不能為空。]字段'productId'上的對象'newProduct'中的字段錯誤:拒絕的值[]; 代碼[Pattern.newProduct.productId,Pattern.productId,Pattern.java.lang.String,Pattern]; 參數[org.springframework.context.support.DefaultMessageSourceResolvable:代碼[newProduct.productId,productId]; 參數[]; 默認消息[productId],[Ljavax.validation.constraints.Pattern $ Flag; @ 3641ef8a,P [1-9] +]; 默認消息[無效的產品ID。 它應以字符P開頭,后跟數字。]字段“名稱”上的對象“ newProduct”中的字段錯誤:拒絕的值[]; 代碼[Size.newProduct.name,Size.name,Size.java.lang.String,Size]; 參數[org.springframework.context.support.DefaultMessageSourceResolvable:代碼[newProduct.name,name]; 參數[]; 默認消息[名稱],50,4]; 默認消息[無效的產品名稱。 它應該至少為4個字符,最多為50個字符。] 2014-07-25 15:03:36 DEBUG DefaultHandlerExceptionResolver:134-解決處理程序中的異常[公共java.lang.String com.nam.webstore.controller.ProductController.processAddNewProductForm (com.nam.webstore.domain.Product,org.springframework.ui.ModelMap,org.springframework.validation.BindingResult,javax.servlet.http.HttpServletRequest)]:org.springframework.validation.BindException:org.springframework.validation .BeanPropertyBindingResult:3個錯誤字段'unitPrice'上的對象'newProduct'中的字段錯誤:拒絕的值[null]; 代碼[NotNull.newProduct.unitPrice,NotNull.unitPrice,NotNull.java.math.BigDecimal,NotNull]; 參數[org.springframework.context.support.DefaultMessageSourceResolvable:代碼[newProduct.unitPrice,unitPrice]; 參數[]; 默認消息[unitPrice]]; 默認消息[單價無效。 它不能為空。]字段'productId'上的對象'newProduct'中的字段錯誤:拒絕的值[]; 代碼[Pattern.newProduct.productId,Pattern.productId,Pattern.java.lang.String,Pattern]; 參數[org.springframework.context.support.DefaultMessageSourceResolvable:代碼[newProduct.productId,productId]; 參數[]; 默認消息[productId],[Ljavax.validation.constraints.Pattern $ Flag; @ 3641ef8a,P [1-9] +]; 默認消息[無效的產品ID。 它應以字符P開頭,后跟數字。]字段“名稱”上的對象“ newProduct”中的字段錯誤:拒絕的值[]; 代碼[Size.newProduct.name,Size.name,Size.java.lang.String,Size]; 參數[org.springframework.context.support.DefaultMessageSourceResolvable:代碼[newProduct.name,name]; 參數[]; 默認消息[名稱],50,4]; 默認消息[無效的產品名稱。 它應至少為4個字符,最多為50個字符。] 2014-07-25 15:03:36 DEBUG DispatcherServlet:1012-空ModelAndView返回到DispatcherServlet,名稱為'DispatcherServlet':假設HandlerAdapter完成了請求處理2014-07-25 15 :03:36 DEBUG DispatcherServlet:991-成功完成請求

在您的WebMvcConfigurerAdapter您可以重寫getValidator()方法以使其返回自定義的Validator

使用LocalValidatorFactoryBean ,您可以調用afterPropertiesSet()getObject()來獲取真實的Validator

老主題,但我有同樣的問題,所以我將這個豆粘貼

@Override
public Validator getValidator() {
    LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
    validator.setValidationMessageSource(messageSource());
    return validator;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM