2014-02-26 21 views
8

我試圖在spring-data-rest中進行驗證以使其工作。從文檔你只需要一個驗證器可用,並且我已經可以工作了,但是當驗證約束被成功捕獲/處理時,我得到一個帶有堆棧跟蹤的500錯誤頁面。在spring-data-rest中使用驗證器返回http 500而不是400

在配置類RepositoryRestMvcConfiguration中,它有一個validationExceptionHandler,它看起來應該像返回400而不是500那樣驗證錯誤。它也是一個懶加載的bean。

我的設置有誤嗎?還是有另一種方法讓spring-data-rest返回400而不是500?

我使用的是彈簧數據休息版本2.0.0發佈

堆棧跟蹤回被Tomcat:

HTTP Status 500 - Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [test.domain.Account] during persist time for groups [javax.validation.groups.Default, ] 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [test.domain.Account] during persist time for groups [javax.validation.groups.Default, ] 
List of constraint violations:[ 
    ConstraintViolationImpl{interpolatedMessage='size must be between 0 and 10', propertyPath=login, rootBeanClass=class test.domain.Account, messageTemplate='{javax.validation.constraints.Size.message}'} 
] 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:965) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

帳戶實體:

@Entity 
public class Account { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long id; 

    @Column(unique = true) 
    @Size(max = 10) 
    String login; 

} 

RestMvcConfig:

@Configuration 
public class RestExporterRestConfig extends RepositoryRestMvcConfiguration {} 
+0

它應該返回400,從客戶端是惡意的請求。您可以使用response.setStatus(400)來設置狀態; – Touchstone

+0

是的我同意它應該返回400,我提出的問題是,我不認爲spring-data-rest通過返回400正確地處理這些驗證錯誤,所以我認爲我在配置或validationExceptionHandler中缺少一些東西bean未被加載或使用。 – wenic

+0

由於服務器端的異常(這非常合適),您將得到500。此外,你應該處理這個異常,並手動設置狀態碼爲400. – Touchstone

回答

4

似乎t o有它的工作;我必須重寫validatingRepositoryEventListener()並手動向偵聽器添加驗證器;

@Configuration 
public class RestExporterRestConfig extends RepositoryRestMvcConfiguration { 

    @Bean 
    public Validator validator() { 
     return new LocalValidatorFactoryBean(); 
    } 

    @Bean 
    @Override 
    public ValidatingRepositoryEventListener validatingRepositoryEventListener() { 
     ValidatingRepositoryEventListener listener = new ValidatingRepositoryEventListener(); 
     configureValidatingRepositoryEventListener(listener); 
     listener.addValidator("afterCreate", validator()); 
     listener.addValidator("beforeCreate", validator()); 
     return listener; 
    } 

} 

我現在得到400返回如下;

400 Bad Request 
{"errors": 
    [{ "entity":"Account", 
     "message":"size must be between 0 and 10", 
     "invalidValue":"login 0dsfdsfdsfdsfdsfdsfdsfds", 
     "property":"login" 
    }] 
} 
+0

你有沒有進一步麻煩呢?我有這個設置,但只有在某些領域得到了上述迴應。對於其他領域,我仍然得到ConstraintViolationException。 – bvulaj

2

以前的答案並沒有爲我工作,我認爲由於春節休息的數據變化所以這裏是一個更新的回答是沒有工作,JPA和MongoDB保存在這個任何人的消費年齡。

不得不加入到我的build.gradle依賴

compile('org.hibernate:hibernate-validator:4.2.0.Final') 

這個配置類

@Configuration 
public class CustomRepositoryRestConfigurerAdapter extends RepositoryRestConfigurerAdapter { 


    @Bean 
    public Validator validator() { 
     return new LocalValidatorFactoryBean(); 
    } 

    @Override 
    public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) { 
     validatingListener.addValidator("afterCreate", validator()); 
     validatingListener.addValidator("beforeCreate", validator()); 
     validatingListener.addValidator("afterSave", validator()); 
     validatingListener.addValidator("beforeSave", validator()); 
    } 
}