Spring RestController中的继承

SJh*_*Jha 6 java rest spring

我有一个Spring RestController,它处理API调用的第1版.

package rest.v1;

@RestController
@RequestMapping("v1/someResource")
public class Controller_V1 {

    @RequestMapping(value = "/{resourceName}", method = RequestMethod.GET)
    public Object retrieve() throws Exception {
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是创建另一个处理版本2请求的控制器.同时我想继承已经在版本1控制器中的实现.这是因为从v1到v2不变的实现将仅从v1继承.

所以像这样:

package rest.v2;

@RestController("controllerV2")
@RequestMapping("v2/someResource")
public class Controller_v2 extends Controller_v1 {

    @RequestMapping(value = "/{resourceName}", method = RequestMethod.GET)
    public Object retrieve() throws Exception {
        //implementation overridden from v1
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做会导致ConflictingBeanDefinitionException.我也不确定是否应该像上面那样扩展控制器.

我知道我可以在同一个控制器的RequestMapping中使用多个路径,如下所示:

@RestController
@RequestMapping(value = { "v1/someResource", "v1/someResource" })
public class Controller_V1 {

}
Run Code Online (Sandbox Code Playgroud)

但上述情况对我的情况不起作用.

以下是控制器扩展时的堆栈跟踪:

 [java] org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [rest-context.xml]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'controller_V1' for bean class [rest.v2.Controller_V2] conflicts with existing, non-compatible bean definition of same name and class [rest.v1.Controller_V1]
     [java]     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:413)
     [java]     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:335)
     [java]     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
     [java]     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
     [java]     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216)
     [java]     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187)
     [java]     at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
     [java]     at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
     [java]     at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
     [java]     at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:540)
     [java]     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:454)
     [java]     at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
     [java]     at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
     [java]     at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
     [java]     at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
     [java]     at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
     [java]     at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
     [java]     at javax.servlet.GenericServlet.init(GenericServlet.java:158)
Run Code Online (Sandbox Code Playgroud)

Lui*_*oza 5

堆栈跟踪的第一行显然存在问题:

org.springframework.beans.factory.BeanDefinitionStoreException:从类路径资源[rest-context.xml]解析XML文档的意外异常; 嵌套异常是org.springframework.context.annotation.ConflictingBeanDefinitionException:bean类[rest.v2.Controller_V2]的注释指定bean名称'controller_V1' 与同名和类[rest.v1 ]的现有非兼容bean定义冲突. Controller_V1]

这是因为你让Spring为你的bean命名.默认情况下,Spring将使用bean名称作为camelCase中当前类的接口名称或超类.

所以,你有这样的东西(Spring给出的名字):

@RestController("controller_V1") //<-- that's the name of the Spring bean
@RequestMapping("v1/someResource")
public class Controller_V1

@RestController("controller_V1") //<-- that's the name of the Spring bean
@RequestMapping("v2/someResource")
public class Controller_V2 extends Controller_V1
Run Code Online (Sandbox Code Playgroud)

如您所见,您只需要重命名第二个bean:

@RestController("controller_V2")
@RequestMapping("v2/someResource")
public class Controller_V2 extends Controller_V1
Run Code Online (Sandbox Code Playgroud)

IMO你应该为你的班级使用更好的名字.