0

我想使用Spring Validation和Annotations來驗證我的表單數據。 所以我有以下對象,例如:Spring Form Validation驗證數據庫插入?

@Entity 
@ComponentScan 
public class Category { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private long id; 

    @NotEmpty 
    private String type; 

    ... 
} 

正如你可以在這裏看到我的type String用於@NotEmpty。我只想用這個來驗證我的表單。它不應該對數據庫插入進行驗證。

所以,當我這樣做:

@RequestMapping(value = "/myForm", method = RequestMethod.POST) 
public String categoryPOST(HttpServletRequest request, Model model, @Valid Category category, BindingResult bindingResult) { 
    if (bindingResult.hasErrors()) { 
     return "form"; 
    } 

    return "redirect:/results"; 
} 

這是工作,我希望它的工作。但是,當我要創建一個虛擬對象:

Category category = new Category(); 

和我進行保存空對象:

this.category_repository.save(category); 

我的錯誤(只是其中的重要組成部分):

Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [my.project.jpa.entity.Category] during persist time for groups [javax.validation.groups.Default, ] 
List of constraint violations:[ 
    ConstraintViolationImpl{interpolatedMessage='darf nicht leer sein', propertyPath=type, rootBeanClass=class my.project.jpa.entity.Category, messageTemplate='{org.hibernate.validator.constraints.NotEmpty.message}'} 
] 

而這不是我想要的。我想使用註解進行表單驗證,但我不希望驗證在數據庫操作上執行。

是不是有可能?

信息

我使用了相同的結果:

javax.validation.constraints.NotNull; 

註解。

+0

順便說一句,'@對實體ComponentScan'註釋看起來很奇怪。你確定你需要它嗎? –

+0

不,不確定。對春天來說是全新的。 – Mulgard

+0

最有可能你可以刪除它:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-scanning-autodetection –

回答

2

是的,這是可能的。

第一個選項是對錶單對象(DTO)和實體使用不同的類。

第二個選項是在保存前配置Hibernate並禁用驗證。因爲這個問題已經回答了好幾次,我公司將提供它們的鏈接:

+0

好吧,但如果真的總是隻想驗證形式,而不是數據庫操作,但我必須始終使用相同的對象?我現在正在開發的項目非常龐大,並且要在代碼中查找所有行,我必須禁用驗證需要很長時間。那麼有沒有更好的方法來驗證使用spring的表單帖子? – Mulgard

+0

在休眠配置中,您不是爲每個實體禁用驗證,而是僅禁用一次驗證。或者,你有多個休眠配置? –

+0

哦,好的。那麼這是一個很好的選擇。謝謝 – Mulgard