2012-03-19 11 views
1

Spring-MVCとjsonを使用してREST APIを開発中です。 Jettyとメモリ内のデータベースを使用して自動テストを実行しています。無効なドメインオブジェクトを投稿すると@NotEmpty注釈からのエラーメッセージが表示されることをテストします。しかし、私が得るのは、デフォルトのJetty 400 Bad Requestページです。Spring MVCでのHibernate Validatorメッセージテキストのキャプチャ

私はいくつかの検証を持つドメインクラスを持っている:

@Entity 
public class Company { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @NotEmpty(message = "Name is a required field") 
    private String name; 

    /* getters, setters */ 
} 

はここ

@Controller 
public class CompanyController { 
    @RequestMapping(value = "/company", 
     method = RequestMethod.POST, 
     consumes = "application/json") 
    public void createCompany(
     @Valid @RequestBody final Company company, 
     final HttpServletResponse response) { 

     //persist company 
     response.setStatus(HttpServletResponse.SC_CREATED); 
     response.setHeader("location", "/company/" + company.getId()); 
    } 
} 

コントローラは、どのように私は"Name is a required field"が応答の一部として返された値を取得することができますか?

答えて

2

これを行います。

@ExceptionHandler(value = MethodArgumentNotValidException.class) 
public void exceptionHandler(final MethodArgumentNotValidException ex, 
        final HttpServletResponse response) throws IOException { 

    for (final ObjectError objectError : ex.getBindingResult().getAllErrors()) { 
     response.getWriter().append(objectError.getDefaultMessage()).append("."); 
    } 
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
} 
0

BindingResultをハンドラメソッドに追加する必要があります。そのオブジェクトは自動的に結果をModelに追加します。これはSpring Formsのtaglibから簡単にアクセスできます。

+0

しかし、「未解決https://jira.springsource.org/browse/SPR-7114です参照してください" –

+1

これは、ハンドラのメソッドシグネチャ内のオブジェクトの順序に過ぎません。以前はこの問題がありました。あなたがする必要があるのは、それらを特定の順序( 'BindingResult'から' Model')にして問題がなくなるだけです。 – atrain

+0

私の元のポストによると、私はモデルを使用していないし、春のフォームtaglibも使用していません。 –

0

春ControllerAdviceとResponseEntityExceptionHandler使用して3.2バリアント:

@ControllerAdvice 
public class ErrorHandler extends ResponseEntityExceptionHandler { 
    @Override 
    protected ResponseEntity<Object> 
    handleMethodArgumentNotValid(MethodArgumentNotValidException e, 
           HttpHeaders headers, HttpStatus status, 
           WebRequest request) { 
     BindingResult bindingResult = e.getBindingResult(); 
     ArrayList<String> errors = new ArrayList<String>(); 
     for (ObjectError error : bindingResult.getGlobalErrors()) { 
      errors.add(error.getDefaultMessage()); 
     } 
     for (FieldError error : bindingResult.getFieldErrors()) { 
      errors.add(
       String.format("%s %s", error.getField(), error.getDefaultMessage()) 
      ); 
     } 
     return handleExceptionInternal(e, StringUtils.join(errors, ", "), 
       headers, HttpStatus.UNPROCESSABLE_ENTITY, request); 
} 
関連する問題