2016-05-22 23 views
0

我正在使用thymeleaf + sprinboot作爲web應用程序,我不知道如何在使用值對象(VO)時控制驗證錯誤。使用VO的Thymeleaf JPA錯誤驗證

正如你所看到的,實體有一個屬性的約束(唯一):

@Entity 
public class Company { 

    @Id 
    @GeneratedValue 
    Integer id = 0; 
    @Column(unique = true) 
    String code; 
    String name; 
    String address; 
... 
} 

但VO不打算把它:

public class CompanyVO { 

    Integer id = 0; 
    String code; 
    String name; 
    String address; 
... 
} 

因此,控制器不能驗證值是重複還是唯一:

@RequestMapping(method = RequestMethod.POST) 
public String set(@Valid CompanyVO companyVO, BindingResult result, Model model){ 

    Company company = new Company(); 

    if(result.hasErrors()){ 
     return "company"; 
    } 

    if(companyVO.getId() != 0){ 
     company = companyRepository.findOne(companyVO.getId()); 
    } 

    mapper.map(companyVO, company); 
    companyRepository.save(company); 
    return "redirect:/companies"; 
} 

如何在視圖中顯示驗證錯誤當我使用VO的?

回答

2

你只有一個選擇。從Hibernate/DB中捕獲有關重複值的異常,並在BindingResult中填充任何額外的錯誤。

執行查詢會引入競爭條件。如果兩個用戶嘗試在大致相同的時間輸入相同的值,那麼這兩個驗證都可以通過(因爲數據庫中沒有任何價值),其中一個用戶稍後會失敗,因爲只有一個事務才能成功。

當您發現異常時,您可以撥打電話BindingResult.addError,並在FieldError中包含字段名稱和錯誤消息。