2015-01-13 139 views
0

這是奇怪的是,我的PUT操作沒有映射到春天的方法,我下面的類...春天裏沒有映射到方法

@Controller 
@RequestMapping(value = { "/**/applicationContext/abcde" }) 
public abstract class AbstractController { 
    // Exception handlers 
} 

此類由另一個抽象類擴展,如下

public abstract class AbstractAdapter extends AbstractController{} 

最後,上述類由下面的類

public class SpringAdapter extends AbstractAdapter implements MyInterface{} 

延伸和我有一些認沽操作,如下所示: -

@Override 
@ResponseBody 
@RequestMapping(method = { RequestMethod.PUT }, consumes = "application/x-www-form-urlencoded",  produces = "application/xml", params = { 
     "param1=some_value", param2 }) 
public MyObject update(
     @RequestParam(value = param2, required = true) @ContentType(value = Encoding.XML)  MyObejct myObject, HttpServletRequest request) throws Exception{ } 

但是,當我調用put方法時,請求沒有映射到我的更新方法。 任何人都可以請幫忙。

+0

你真的確定你的請求包含所有必需的選項嗎? 'Content-Type'和'Accept'標題。該URL有'param1 = some_value',我想'param2'是一個靜態常量,類似於'myParam = myValue'風格。 –

+1

我也很好奇聽到你的SpringAdapter實際上是否使用了@Controller註解。否則它將不會被掃描,因此也不會被發現 – Joeblade

+0

@Joeblade:因爲我的父類已經標記爲Controller註解,因此我不需要用Controller註釋標記我的SpringAdapter。 – Apollo

回答

2

您的子類未標記爲@Controller,因此Spring(它在掃描控制器時)未找到它。

請參閱this answer

基本上註釋默認情況下不繼承。 您可以使用註解註釋中的聲明將其標記爲繼承as is shown here 使用:

public @interface Inherited 

,但如果你看看the controller source,這個關鍵字沒有在控制器執行春天用途使用。

@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Component 
public @interface Controller { 

所以我會假設@Controller不會在您的情況下繼承。我將首先用一個簡單的例子(類A擴展B類,只用一個簡單的未經修改的方法)來驗證這個繼承。

+0

感謝你的建議,問題是我的孩子班沒有標記控制器註釋,標記與控制器讓我通過這個問題。 – Apollo