2016-05-22 4 views
0

私はWebアプリケーションにthymeleaf + sprinbootを使用していますが、バリューオブジェクト(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

実際には1つのオプションしかありません。重複する値についてHibernate/DBから例外をキャッチし、BindingResultの余分なエラーを取り込む。

クエリを実行すると、競合状態が発生します。 2人のユーザーがほぼ同じ時間に同じ値を入力しようとすると、両方のバリデーションが成功する可能性があります(DBに値がないため)後で失敗するのは、1つのトランザクションだけが成功するためです。

例外をキャッチすると、フィールド名とエラーメッセージを含むFieldErrorBindingResult.addErrorを呼び出すことができます。

関連する問題