2015-01-13 2 views
0

Это странно, что мои операции PUT не сопоставляется с методом родниковой, я следующие классы ...Spring 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, и поэтому мне не нужно отмечать мой SpringAdapter с помощью аннотации Controller. – Apollo

ответ

2

Ваш подкласс не отмечен как @Controller, и поэтому весна (когда он сканирует контроллеры) не находит его.

Пожалуйста, см 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

Спасибо за ваше предложение, проблема был класс My child не отмечен аннотациями Controller, пометив его контроллером, я получил эту проблему. – Apollo

Смежные вопросы