JSR 303驗證相關問題及解決 辦法

weixin_34194087發表於2017-01-04

使用 Hibernate Validator


匯入Hibernate Validator的相關jar

1785511-98ac0ae850ad036b.png
1483444847480.png

在相關欄位屬性上進行註解

@Size(min = 2, max = 6, message = "{Size.product.name}") message 可以不寫,會使用預設的來自JSR 303驗證器的錯誤訊息;
如果要自定義錯誤訊息的話,請看自定義錯誤訊息操作步驟;

  • Product類
public class Product {
    private int id;
    
    @Size(min = 2, max = 6)
    private String name;
    
    private float price;
    private Date date;

    public Product() {
    }
    
    // 、、、getter and setter
}
  • ProductController類
@Controller
@RequestMapping("/product")
public class ProductController {
    @Autowired
    private IProductService productService;

    @RequestMapping("/input")
    public String inputInfo(Model model) {
        model.addAttribute("product", new Product());
        return "product-add";
    }

//必須用@Valid 對Product引數進行標註

    @RequestMapping("/add")
    public String addProduct(@Valid @ModelAttribute Product product, BindingResult bindingResult, Model model) {
        if (bindingResult.hasErrors()){
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for (ObjectError objectError:allErrors){
                System.out.println(objectError.getDefaultMessage());
            }
            model.addAttribute("allErrors", allErrors);
            return "product-add";
        }
        productService.add(product);
        return "redirect:/product/list";
    }
    
    // 、、、、其他操作
}

效果:

1785511-3c875bbf31a4235f.gif
預設錯誤提示資訊.gif

以上操作就可以實現驗證器驗證了,不過錯誤訊息來自JSR 303的預設錯誤提示訊息;

下面是自定義錯誤提示訊息的操作:

先在Resource新增屬性檔案,

其中ValidationMessages即 properties的名稱,注意:properties檔案的名字一定要命名成:ValidationMessages.properties

填入相關錯誤提示資訊:

格式:

constraint.object.property

為了覆蓋以@Size標註約束的 Product 物件的 name 屬性,可以在屬性檔案中使用下面的鍵:

Size.product.name

為了覆蓋以@Past標註約束的 Product 物件的 date 屬性,可以在屬性檔案中使用下面的鍵:

Past.product.date

內容如下:

1785511-50749850732833eb.png
1483446900377.png
  • 驗證器不需要顯式註冊,但是如果想要從某個屬性檔案中獲取錯誤訊息,則需要通過宣告messageSource bean,高速Spring要去查詢這個檔案;
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="ValidationMessages"/>
    </bean>
  • 在Product更改如下
public class Product {
    private int id;
    
    @Size(min = 2, max = 6, message = "{Size.product.name}")
    private String name;
    
    private float price;
    private Date date;

    public Product() {
    }
    
    // 、、、getter and setter
}

效果:

1785511-f8ce8b42805d8c94.gif
自定義錯誤提示資訊.gif

解決中文亂碼問題

  • IntelliJ IDEA 2016設定
1785511-9fc8c27a590027a8.png
1483447433512.png
  • Eclipse設定
1785511-5d868aae150ec96e.png
1483447647598.png

相關文章