2014-01-20 158 views
0

以下是我的控制器。我的程序根據表單輸入生成一個輸出。在整個項目中,有多個輸入表單,用於生成輸出對象。所以,基本流程是一樣的。所以我想要一個單一的多動作控制器來完成所有這些。春季自動裝配變量名稱

挑戰: 1.服務類別改變。雖然所有服務都實現相同的接口,並且控制器調用相同的接口方法。 2.輸入對象改變。儘管輸入對象除setter和getter之外沒有其他方法。所以我讓他們全部實現一個空的界面。

問題:

  1. 如何更改的預選賽中,基於路徑上。我可以使用路徑變量嗎?

  2. 假設路徑有這個值 - > singleton。然後我的相應的bean名稱將是singletonService和singletonInput。我想創建一個存儲此映射信息的常量類。那麼,我可以使用Spring表達式語言在限定符內調用它嗎?例子,而不是限定符(variablePathName) - > Qualifier(getQualifierName ['variablePathName'])類似的東西?

  3. 請同時說明這個理論。據我所知,bean被創建,在請求被映射之前自動裝配...這是否意味着我試圖在這裏實現的功能根本不可能。在這種情況下,你是否會建議使用Controller-服務對來處理每個請求,並使用基本相同的代碼?但我覺得必須有某種方式來實現我想要......

代碼:

@Cotroller 
@RequestMapping(value="/generate/{path}") 
public class TestController { 

    @Autowired 
    @Qualifier(......) 
    private IService service; 

    @Autowired 
    @Qualifier(......) 
    IUserInput userInput; 

    @RequestMapping(method = RequestMethod.POST) 
    //Some handler method 
} 

回答

2

你在說的沒錯自動裝配是前面所有做一次(第3點)。使用字段@Autowired@Qualifier註釋的字段將無法實現您想要的內容 - 因爲這些字段始終會引用同一個bean實例。

你可能會更好問問春天爲特定的服務bean的名稱 - 基於路徑變量。您可以在單個控制器實例中執行此操作。例如:

@Cotroller 
@RequestMapping(value="/generate/{path}") 
public class TestController { 

    @Autowired 
    private ApplicationContext applicationContext; 

    @RequestMapping(method = RequestMethod.POST) 
    public String someHandlerMethod(@PathVariable String path) { 
     IService service = (IService) applicationContext.getBean(path + "Service"); 
     IUserInput userInput = (IUserInput) applicationContext.getBean(path + "UserInput"); 

     // Logic using path specific IService and IUserInput 
    } 
} 
+0

謝謝。我想它會起作用。我現在懷疑的是,這將需要我配置XML(我不想),或者我可以簡單地註釋我的服務類爲@Service(「pathService」)? 我該如何註釋我的UserInput類?用@Bean(「pathUserInput」)或@Component(「pathUserInput」)? – Nikhil

+1

你應該能夠註釋你的類,並確保它們被''拾取 - 所以不需要使用XML。 Spring使用的默認服務名稱是類名,但帶有小寫的第一個字母 - 但如果這不是您想要的名稱,則可以明確地傳遞名稱,如「@Service(」pathService「)」。你可以用你的Input對象來做同樣的事情並且註釋這些'@Component(「pathUserInput」)' –

+0

以這種方式使用applicationContext時,我得到了NoSuchBeanDefinitionException,雖然它存在。我用'@ Component'和'@ Service'註解了類。如果我使用'@ Configuration'在基於XML/Java的配置中手動配置這些bean,它將工作......爲什麼Bean不會被ApplicationContext讀取。我錯過了什麼嗎? – Nikhil