2011-04-25 45 views
1

說我有兩個獨立的類:如何確保URL參數映射到Spring MVC中的右側字段?

class Foo { 
    int bar; 
} 

class Baz { 
    int bar; 
} 

,我想接受每個實例中的Spring MVC控制器:

@RequestMapping("/someurl") 
public ModelAndView myController(Foo f, Bar b) { 
    // etc 
} 

如何構建一個包含f.bar唯一值的網址和b.bar? Spring接受?bar=somevalue並將somevalue指定爲f.barb.bar,但我希望爲每個值賦予唯一值。

更一般地說,我如何將參數的範圍限制在一個控制器(通過一個帶有GET參數的URL)以僅適用於特定對象的字段?

回答

2

我能想到的兩種方法。

1)製作一個包含foo和bar的包裝對象,以便在查詢字符串中使用唯一的綁定路徑。在你的方法簽名中有多個綁定目標'工作',但是你發現有一些問題。如果實際值來自表單字段,並希望表單使用Spring表單標籤「正常工作」,這也將是您的最佳選擇。

2)創建一個自定義PropertyEditor,它可以解釋一個具有某種名稱空間的數字,然後只解析和綁定與當前綁定目標一起的數字部分。例如,您的查詢字符串看起來像?bar=foo/12//bar/45(我確定可以製作更好的表示),然後在PropertyEditor的setAsText方法中解析出您想要的內容。如果你從表單字段獲得這些值,這將是一個痛苦。

+0

感謝。你知道爲什麼Spring MVC可以將MyObject.foo.bar命名爲foo.bar,但不理解MyObject.foo.bar?看起來很瘋狂。 – HenryR 2011-04-25 23:51:08

+0

綁定框架是圍繞單個表單映射到具有已知上下文的單個目標對象上構建的?我能做的最好。用註釋驅動的控制器偶然地有多個目標綁定「出現」的能力。活頁夾最初是在嚴格的1:1控制器:commandObject方案中創建的。 – Affe 2011-04-26 00:18:48

2

OK,來處理URL是這樣的:

/someurl?fooId=3&barId=5 

你需要寫這樣的事:

@RequestMapping("/someurl") 
public ModelAndView myController(
      @RequestParam("fooId") int fooId, 
      @RequestParam("barId") int barId) { 
    Foo foo = new Foo(); 
    foo.bar = fooId; 

    Bar bar = new Bar(); 
    bar.bar = barId; 

    // etc. 
} 

,你可以去的方式超出該解決方案並創建自定義轉換器:

public class FooConverter implements Converter<Integer, Foo> { 
    @Override 
    public Foo convert(Integer source) { 
     Foo foo = new Foo(); 
     foo.bar = source; 
     return foo; 
    } 
} 

public class BarConverter implements Converter<Integer, Bar> { 
    @Override 
    public Bar convert(Integer source) { 
     Bar bar = new Bar(); 
     bar.bar = source; 
     return bar; 
    } 
} 

然後在春天註冊它們之後:

<mvc:annotation-driven conversion-service="conversionService"/> 
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> 
    <property name="converters"> 
     <set> 
      <bean class="xyz.FooConverter"/> 
      <bean class="xyz.BarConverter"/> 
     </set> 
    </property> 
</bean> 

可以使用更短的溶液(其中Foo和Bar被自動轉換):

@RequestMapping("/someurl") 
public ModelAndView myController(
      @RequestParam("fooId") Foo foo, 
      @RequestParam("barId") Bar bar) { 

    // etc. 
}