2014-11-21 68 views
4

我想在使用約束條件註釋反序列化時驗證json,但它似乎不起作用。例如使用約束條件驗證json註釋不起作用

import com.fasterxml.jackson.annotation.JsonProperty; 
import javax.validation.constraints.Min; 
import javax.validation.constraints.NotNull; 

public class SimpleFooRequest { 

    @NotNull 
    @JsonProperty(value = "count") 
    @Min(value = 100,message = "must be min 10") 
    private Integer count; 

    @NotNull 
    private String name; 
    public String getName() {return name; } 
    public void setName(String name) { this.name = name; } 
    public Integer getCount() {return count;} 
    public void setCount(Integer count) {this.count = count;} 
} 
試圖解編JSON

@Test 
public void testFooRequest() throws Exception 
{ 
    String fooJson = {"count":-10} 
    ObjectMapper mapper = new ObjectMapper() 
    SimpleFooRequest request = mapper.readValue(fooJson,SimpleFooRequest.class); 
    assert request.getCount().equals(-10);//expected fail but it pass !!! 
} 

似乎傳遞雖然我預計,斷言將失敗伴隨計數最小值限制時

。我也試圖把在制定者的註釋,但得到了同樣的結果

我有<mvc:annotation-driven />hibernate-validator-4.3.1.Final.jar在我的依賴 我知道我可以創建自定義的驗證,但我認爲,對於簡單的驗證,我可以使用的註解。 我需要做些什麼才能使它工作?

回答

4

註解只是元數據。他們不是可以執行任何驗證的程序。驗證程序是將使用元數據的程序。在容器中,容器將管理驗證器。在基本的單元測試或獨立測試中,您需要自己管理驗證器。

這就是說,即使驗證程序也無法阻止對象被創建/填充(因爲您似乎在您的測試中聲稱)。它只是驗證該值是有效的。如果不是,驗證器拋出一個異常和/或列出一些約束違規。無論是容器,還是您應該處理如何處理異常/違規。

而且據我所知,有自動JSR-303的支持沒有ObjectMapper配置,而反序列化

一個更好的單元測試,可能看起來像

/* ----- Using the Hibernate Validator implementation ----- */ 
@Test 
public void testInvalidCount() throws Exception { 
    final String json = "{\"count\":-10, \"name\":\"Stack\"}"; 
    ObjectMapper mapper = new ObjectMapper(); 
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
    Validator validator = factory.getValidator(); 

    SimpleFooRequest request = mapper.readValue(
           json, SimpleFooRequest.class); 
    Set<ConstraintViolation<SimpleFooRequest>> violations 
          = validator.validate(request); 
    Assert.assertEquals(1, violations.size()); 
    Assert.assertEquals("must be min 10", 
      violations.iterator().next().getMessage()); 
} 
0

如何在setter方法驗證? 傑克遜打電話給你的製片人如果存在...