当前位置: 首页 > 知识库问答 >
问题:

spring MVC Bean与Java配置的验证

乌骏
2023-03-14

我正在使用spring MVC的Java配置。我无法使Bean验证工作。我有一个已注释的域类,我想在我的控制器中使用@valid。我知道,使用XML配置,我将以以下方式设置验证器

我怎么能用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的配置类:(***更新以获取验证符***)

@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>

在将记录器设置为DEBUG后进行了更新,这是我在控制台中看到的内容。我可以看到它正在启动验证,但我不知道为什么它说我正在向DispatcherServlet返回null?我正在返回视图名称。

对象“New Product”中字段“Unit Price”上的字段错误:拒绝值[null];代码[NotNull.NewProduct.UnitPrice,NotNull.UnitPrice,NotNull.java.Math.BigDecimal,NotNull];参数[org.springframework.context.support.defaultmessageSourceResolvable:代码[newproduct.unitPrice,unitPrice];参数[];default message[unitPrice]];默认消息[单价无效,不能为空。]对象“new product”中字段“product id”上的字段错误:拒绝值[];代码[pattern.newproduct.productID,pattern.productID,pattern.java.lang.String,patter];参数[org.springframework.context.support.defaultmessageSourceSolvable:代码[newproduct.productId,productId];参数[];默认消息[productId],[ljavax.validation.constraints.pattern$flag;@3641ef8a,P[1-9]+];默认消息[无效的产品ID。它应以字符P开头,后跟数字。]字段“name”上的对象“new product”中的字段错误:被拒绝的值[];参数[size.newproduct.name,size.name,BindingResult,javax.servlet.httpServletRequest)]:org.SpringFramework.Validation.Bindexception:org.SpringFramework.Validation.BeanPropertyBindingResult:3错误对象“new product”中字段“单价”错误:拒绝值[null];代码[notNull.NewProduct.unitPrice,notNull.unitPrice,notNull.java.Math.BigDecimal,notNull];参数d以字符P开头,后跟数字。]对象“new product”中字段“name”上的字段错误:拒绝值[];代码[size.newproduct.name,size.name,size.java.lang.String,size];参数[org.springframework.context.support.defaultmessageSourceSolvable:代码[newproduct.name,name];参数[];默认消息[name],50,4];默认消息[无效产品名。最小长度为4个字符,最大长度为50个字符。]2014-07-25 15:03:36 DEBUG DefaultHandlerExceptionResolver:134-解析处理程序中的异常[public java.lang.string com.nam.webstore.controller.productController.ProcessAddNewProductForm(com.nam.webstore.domain.product,org.springframework.ui.modelmap,org.springframework.validation.bindingresult,参数[];默认消息[unitPrice]];默认消息[单价无效。不能为空。]字段“product id”上的对象“new product”中的字段错误:拒绝值[];代码[pattern.newproduct.productID,pattern.product.productID,pattern.java.lang.String,patter];参数[org.springframework.context.support.defaultmessageSourceSolvable:代码[newproduct.productID,productID];参数[];默认消息[productId],[Ljavax.validation.constraints.pattern$flag;@3641EF8a,p[1-9]+];默认消息[无效的产品ID。它应该以字符P开头,后跟数字。]对象“new product”中字段“name”上的字段错误:拒绝值[];代码[size.newproduct.name,size.name,size.java.lang.String,size];参数[org.springframework.context.support.defaultmessageSourceResolvable:代码[newproduct.name,name];参数[];default message[name],50,4];默认消息[无效的产品名称。最小4个字符,最大50个字符。]2014-07-25 15:03:36 DEBUG DispatcherServlet:1012-Null ModelAndView返回到名为“DispatcherServlet”的DispatcherServlet:假设HandlerAdapter已完成请求处理2014-07-25 15:03:36 DEBUG DispatcherServlet:991-成功完成请求

共有1个答案

郜驰
2023-03-14

WebMVCConfigurerAdapter中,可以重写getValidator()方法,使其返回自定义的验证器

使用LocalValidatorFactoryBean,您可以调用AfterPropertiesSet()GetObject()来获得真正的验证器

 类似资料:
  • 到现在为止我们只看了一下基本的验证配置,让给我们看看一些稍微高级点的身份验证配置选项。 内存中的身份验证 我们已经看到了一个单用户配置到内存验证的示例,下面是配置多个用户的例子: @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth

  • 我们的例子中要求用户进行身份验证并且在我们应用程序的每个URL这样做。我们可以通过给http.authorizeRequests()添加多个子节点来指定多个定制需求到我们的URL。例如: protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() //1

  • Java 安装与配置 本章节叙述了Java 在 MacOS、PC、ECS 服务器上的安装以及配置过程。

  • 当我在Google play上完成新版本的上传时,我得到了这样的消息:,,,请提供帮助!

  • 本文向大家介绍Debian配置JDK1.7 与Linux Java Helloworld,包括了Debian配置JDK1.7 与Linux Java Helloworld的使用技巧和注意事项,需要的朋友参考一下 其实JAVA的原生平台是Linux的,只是它可以跨平台运行而已。在Linux中甚至就有了原生的JDK,但是这些JDK难免不完整,因此最好自己配置一个JDK1,7,为以后的Tomcat,安卓

  • 使用krasa-jaxb-tools jaxb-plugin,我生成了以下内容: 来自XSD架构: 我得到了注释元素: 使用JAXB,我成功地生成了有效的XML(它通过了XSD验证--包括上面提到的字符串的格式)。 但是,如果我尝试使用Bean验证验证上面提到的字符串,它会抛出错误--如果它被写为“small123”,它会说它应该大写(失败small.123[a-za-z0-9.]{0,27}re