2016-10-03 178 views
1

我正在構建一個REST API。它由一個資源(@Controller)組成,該資源即使在其中一個必填字段不存在時也會返回響應204。Spring 3 - 基於註釋的Bean驗證

我正在使用Spring 3.1,validation-api(1.1.0.Final)& Hibernate-validator(4.3.0)。不確定Hibernate驗證器在這裏扮演什麼角色。

<dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.1.0.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>4.3.0.Final</version> 
      <exclusions> 
       <exclusion> 
        <groupId>javax.validation</groupId> 
        <artifactId>validation-api</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 

我有一個春天控制器@Controller和豆與@Component

@POST 
     @Consumes(value = {MediaType.APPLICATION_JSON}) 
     @Produces(value = {MediaType.APPLICATION_JSON}) 
     @RequestMapping(method = RequestMethod.POST) 
     public Response addUserData(@Valid @RequestBody UserData userDataRequest) throws ResourceException { 
    ... 
    } 

我的UserData bean有

@Component 
    public class UserData { 

     @NotNull(message = "user ID should not be null") 
     @Min(value = 1, message = "user ID should not be empty") 
     @Max(value = 20, message = "user ID should have length of more than 20") 
     @Pattern(regexp="[A-Z][a-z]+", message = "Only Alphanumeric characters allowed") 
     private String userId; 

    } 

我的驗證沒有得到執行。當我不傳遞「userId」時,不會拋出任何錯誤。我在這裏錯過了什麼?

回答

1

我最終結束了使用澤西Bean驗證,而不是春季。這是因爲我的其他代碼無論如何都是在使用Jersey。爲了做到這一點,我只導入了Jersey Bean Validation jar,並在web.xml中添加了一些小改動。驗證正在工作。

謝謝@手動約旦。我會提高你的答案,因爲它給了我正確的線索。

<!-- jersey beanValidation --> 
     <init-param> 
      <param-name>jersey.config.beanValidation.enableOutputValidationErrorEntity.server</param-name> 
      <param-value>true</param-value> 
     </init-param> 
0

也許傳遞給你的「addUserData」方法,一個bindingResult對象,所以你可以測試和檢索驗證錯誤。 這裏是如何使用它的例子:Validation form input

+0

我會盡力的,但我不認爲這就是問題,因爲狀態出來爲204 @Valid應該認識到,用戶id爲空,然後回來用400更新的問題是相同的。順便說一句,我已經使用了你粘貼到目前爲止的確切鏈接。 – greengrassbluesky

+0

更新 - 當我添加BindingResult(即使我沒有MVC類型的實現)時,我得到以下錯誤SEVERE:StandardWrapper.Throwable org.glassfish.jersey.server.model.ModelValidationException:應用程序資源模型的驗證失敗應用初始化。 [[致命]沒有爲public javax.ws.rs.core.Response類型的參數添加註入源add(UserData,BindingResult) – greengrassbluesky

2

您必須對基礎設施

@EnableWebMvc 
@Configuration 
public class WebMvcConfig extends WebMvcConfigurerAdapter { 

    ... 

    @Autowired 
    private ValidatorConfig validatorConfig; 

    ... 

    @Override 
    public Validator getValidator() { 
     return validatorConfig.localValidatorFactoryBean(); 
    } 

    ... 

}

validatorConfig來自

@Configuration 
public class ValidatorConfig { 

    @Autowired 
    private ReloadableResourceBundleMessageSource rrbms; 

    @Bean 
    public LocalValidatorFactoryBean localValidatorFactoryBean(){ 
     LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); 
     localValidatorFactoryBean.setValidationMessageSource(rrbms); 
     return localValidatorFactoryBean; 
    } 

} 

最後以下(我建議你考慮將錯誤信息放在.properties文件中,如validation.properties下面的顯示方式)

@Configuration 
public class MessageSourceConfig { 

    @Bean(name="messageSource") 
    public ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource() { 
     ReloadableResourceBundleMessageSource resource = new ReloadableResourceBundleMessageSource(); 
     resource.setBasenames("classpath:/com/manuel/jordan/somethinga", 
           "classpath:/com/manuel/jordan/validation/validation"); 
     resource.setDefaultEncoding("UTF-8"); 
     return resource; 
    } 

} 

一些考慮和建議:

  • 變化@Valid@Validated(請參閱@Validated
  • 的API中取出@ComponentUserData(即代表了一種實體對?)。請記住,對於該類每個實例是唯一 Spring所管理的任何beanSingleton.
  • 把錯誤信息在.properties文件
  • 從哪裏來的@POST@Consumes@Produces註解?他們不是春API

加成01關於你的評論中:

  • 是的,你必須使用@EnableWebMVC。它指示Spring爲Web環境內部創建一些特殊的Bean。請參閱@EnableWebMVC API。這個註釋非常重要。即使對於休息我也使用該註釋。

  • 關於Rest標註,請使用Spring標註。如@RequestMapping和新的「變體」,如@GetMapping,@PostMapping等。該註釋包含producesconsumes屬性。我從來沒有見過你將混合來自Rest的兩套註解混合在一起。

加成02

WebMvcConfigurerAdapter類代表所有的Spring MVC基礎設施

因此XML的XML配置文件

  • @EnableWebMvc相當於<mvc:annotation-driven/>
  • 關於驗證它應該是:<mvc:annotation-driven validator="beanNameValidator" />其中具有.xsd根據validator屬性說:

屬性:驗證待 用來驗證控制器模型對象的驗證bean的名稱。該屬性不是
必需的,只有在需要配置自定義 Validator時才需要明確指定。如果未指定,則在類路徑 上存在JSR-303提供程序時,將安裝JSR-303 驗證。

beanNameValidator與根據我@Bean似乎應該localValidatorFactoryBean

+0

感謝您提供詳細的響應。你建議使用EnableWebMVC嗎?即使我正在編寫REST API?對於你從哪裏開始,消費者註釋來自哪裏,我正在使用follwing- import javax.validation.Valid; import javax.validation.constraints。*; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; – greengrassbluesky

+0

請參閱'加法01'部分 –

+0

我無法使用WebMvcConfigurerAdapter,因爲它是Spring 4.3的一部分。我堅持使用Spring 3.1。任何其他的選擇? – greengrassbluesky