对Parent类中定义的@RequestMapping使用多个子控制器

时间:2013-01-30 15:35:53

标签: java spring spring-mvc controller abstract

我有一个父类P,它定义了一个这样的请求映射:

public abstract class P {
 @RequestMapping(value = "/a/b/c", method = RequestMethod.POST)
    public String productLink(@RequestParam("abc") String json) throws Exception {
        return getProductLinks(json);
    }
}

我有几个孩子Controller个班,ClassImpl就是其中之一:

@Controller
public class ClassImpl extends P {
@RequestMapping(value = "/start", method = RequestMethod.GET)
    public String start(@RequestParam(value = "keyword", required = true) String keyword,
            @RequestParam(value = "keywordId", required = true) long keywordId) throws Exception {
     //Something
    }
}

如果我只使用一个子类运行此应用程序,它可以正常工作,但它会导致多个子控制器出现问题。

当我运行我的应用程序时,出现错误"Cannot map handler ClassImpl to URL path [/a/b/c]: There is already handler [a.b.c.d.ClassImpl@a92aaa] mapped"

It seems that because of multiple child classes, it is unable to find the controller for this mapping which is understood.

在每个类(或一个单独的类)中定义@RequestMapping是唯一的方法吗?我不想在所有地方放置类似的代码。是否有任何解决方法可以将其保留在父类中并继续使用它?

谢谢,

2 个答案:

答案 0 :(得分:0)

你不应该在abstract classe中使用@RequestMapping。这个注释适用于真正的控制器,所以具体是classe。

使用抽象类,因为他们打算使用,即分解代码,而不是做工作。

您可以在这里执行以下操作:

public abstract class P {

    public String productLink(String json) throws Exception {
       return getProductLinks(json);
    }
}

然后

@Controller
public class ClassImpl extends P {

    @RequestMapping(value = "/start", method = RequestMethod.GET)
    public String start(@RequestParam(value = "keyword", required = true) String keyword,
        @RequestParam(value = "keywordId", required = true) long keywordId) throws     Exception {
         //Something
    }

    //here reusing the code from superclass
    @RequestMapping(value = "/a/b/c", method = RequestMethod.POST)
    public String productLink(@RequestParam("abc") String json) throws Exception {
        return super.getProductLinks(json);
    }
}

这添加了一些样板代码,但这是恕我直言的方法。

答案 1 :(得分:0)

  

在每个类(或一个单独的类)中定义@RequestMapping是唯一的方法吗?

简短的回答是肯定的。我个人认为它属于一个单独的类。

为什么要将productLink()放在父类中呢?这不是一个抽象的方法而且你没有覆盖它,所以对我来说它没有多大意义。