2015-04-06 70 views
2

領域的默認值我有一個簡單的控制器與方法測試:Spring MVC。爲方法參數

@RequestMapping(produces = "application/json") 
    @ResponseBody 
    public HttpEntity<Void> test(Test test) { 
     return new ResponseEntity<>(HttpStatus.OK); 
    } 

測試類看起來是這樣的:

public class Test { 
    private String name; 
    private Date date; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Date getDate() { 
     return date; 
    } 

    @DateTimeFormat(iso= DateTimeFormat.ISO.DATE) 
    public void setDate(Date date) { 
     this.date = date; 
    } 
} 

我需要默認值測試對象的領域。如果我有一個原始參數,我可以使用@RequestParam(required = false, defaultValue = "someValue")。但是,對於非原始參數,這種方法似乎不起作用。我看到幾個變體如何處理它:

  • 在構造函數中賦值。不是很好,因爲可能我會 不同的方法需要不同的默認值。
  • 寫入自定義DataBinder。更好,但不同 默認值的問題仍然存在。
  • 使用默認值編寫自定義DataBinder和自定義註釋。

我是否錯過了一些東西,並有內置的功能,可以解決我的問題?

+1

,檢查後是'null'? – 2015-04-06 11:00:00

+0

這不是很方便。在每個有默認值的方法中,我需要寫一些ifs和assignments。雖然使用原始類型,但它是通過註釋處理的。 – 2015-04-06 11:52:21

回答

1

您可以依靠四個簡單的步驟來解決爭論,就像您在第三點中所建議的那樣。

  1. 創建一個註釋例如

@Target(ElementType.PARAMETER) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
public @interface TestDefaultValues { 
    String[] value(); 
} 
  • 例如寫解析器

  • public class TestArgumentResolver implements HandlerMethodArgumentResolver { 
    
        public boolean supportsParameter(MethodParameter parameter) { 
         return parameter.getParameterAnnotation(TestDefaultValues.class) != null; 
        } 
    
        public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, 
          WebDataBinderFactory binderFactory) throws Exception { 
         TestDefaultValues attr = parameter.getParameterAnnotation(TestDefaultValues.class); 
         String[] value = attr.value(); 
         Test test = new Test(); 
         test.setName(value[0]); 
         test.setDate(new Date(value[1])); 
         return test; 
        } 
    
    } 
    
  • 寄存器解析器

  • <mvc:annotation-driven> 
         <mvc:argument-resolvers> 
          <bean class="your.package.TestArgumentResolver"></bean> 
         </mvc:argument-resolvers> 
    </mvc:annotation-driven> 
    
  • 在使用註解的控制器方法例如

  • public HttpEntity<Void> test(@TestDefaultValues({"foo","11/12/2014"}) Test test) { 
    

    實例化日期只是爲了得到落實的要點,顯然你爲什麼不能在方法本身分配的默認值,你會使用什麼是你的想法

    +0

    謝謝你的回答。這比較好,但我們仍然與測試課相關。我希望Spring中有這樣一個通用註釋,但似乎沒有。 – 2015-04-07 07:09:24

    +0

    歡迎你。實際上,根據您的需要,但您可以使用此方法並使其更通用,請注意_resolveArgument_方法返回_Object_。例如,您可以使用以下簽名'(@TestDefaultValues({「foo」,「2014年12月11日」,「測試」})對象測試)'而不是在解析器類中使用額外的註釋參數來找出哪個您正在實例化的類,以及其他註釋參數來填充默認值。無論如何,唯一重要的是你知道構造,你會決定是否可以用它來實現你想要的 – 2015-04-07 07:51:06