2016-11-07 78 views
0

在彈簧安置控制器類的方法,有三種方法具有相同@RequestParams,但不同RequestMappings和行爲,如在下面的(簡化的)例子:彈簧安置控制器:如何避免與相同RequestParams

@RequestMapping(method = GET, value = "/search") 
    public MySearchResponse findAll(
      @RequestParam(required = false, value = "foo") String foo, 
      @RequestParam(required = false, value = "bar") String bar, 
      @RequestParam(required = false, value = "baz") Long baz, 
      @RequestParam(required = false, value = "fooBar") Long fooBar 
    ) { ...} 

@RequestMapping(method = GET, value = "/export") 
    public MyExportResponse exportAll(
      @RequestParam(required = false, value = "foo") String foo, 
      @RequestParam(required = false, value = "bar") String bar, 
      @RequestParam(required = false, value = "baz") Long baz, 
      @RequestParam(required = false, value = "fooBar") Long fooBar 
    ) { ...} 

有沒有辦法避免@ RequestParam的代碼重複?

+1

使用對象綁定到。 –

回答

1

將它們替換爲單個對象。

static class MyParmeters { 
    String foo; 
    String bar; 
    Long baz; 
    Long fooBar; 
} 

@RequestMapping(method = GET, value = "/search") 
public MySearchResponse findAll(MyParmeters params) { ... } 

@RequestMapping(method = GET, value = "/export") 
public MyExportResponse exportAll(MyParameters params) { ... } 

另請參閱How to bind @RequestParam to object in Spring MVC

+0

這似乎是一個相當不錯的解決方案:-)有沒有辦法可以方便地檢查是否滿足'required'-約束條件(如果有'@ RequestParams'屬性爲'required = true') –

+1

[Spring MVC:如何執行驗證?](http://stackoverflow.com/q/12146298/476716) – OrangeDog

0

您可以定義一個名爲MyResponse父類型,然後你可以使用ResponseEntity,如下圖所示:如下圖所示

@RequestMapping(method = GET, value = "/searchOrExport") 
public ResponseEntity<MyResponse> exportAll(@RequestParam(required = false, value = "foo") String foo, 
      @RequestParam(required = false, value = "bar") String bar, 
      @RequestParam(required = false, value = "baz") Long baz, 
      @RequestParam(required = false, value = "fooBar") Long fooBar) { 
     //code to handle search and Export 
} 

Bean類API:

public abstract class MyResponse { 
    //any common properties add here 
} 


public class MySearchResponse implements MyResponse { 
    //add MySearchResponse properties 
} 

public class MyExportResponse implements MyResponse { 
    //add MyExportResponse properties 
}