Jakarta ee 如何创建通用'/ping&x27;抽象BaseController中的API资源?

Jakarta ee 如何创建通用'/ping&x27;抽象BaseController中的API资源?,jakarta-ee,spring-boot,abstract-class,Jakarta Ee,Spring Boot,Abstract Class,我有一个基本控制器: @Controller public abstract class BaseController { /** * The Logger for this class hierarchy */ protected Logger logger = LoggerFactory.getLogger(this.getClass()); @RequestMapping(value = "/ping", produces = MediaTy

我有一个基本控制器:

@Controller
public abstract class BaseController {

    /**
     * The Logger for this class hierarchy
     */
    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    @RequestMapping(value = "/ping", produces = MediaType.APPLICATION_JSON_VALUE)
    public ServiceResponse<?> ping() {
        ServiceResponse<Object> serviceResponse = new ServiceResponse<>(ResponseStatus.SUCCESS);
        return serviceResponse;
    }
}
@控制器
公共抽象类BaseController{
/**
*此类层次结构的记录器
*/
受保护的记录器Logger=LoggerFactory.getLogger(this.getClass());
@RequestMapping(value=“/ping”,products=MediaType.APPLICATION\u JSON\u value)
公共服务响应ping(){
ServiceResponse ServiceResponse=新的ServiceResponse(ResponseStatus.SUCCESS);
返回服务响应;
}
}
并且很少有其他控制器像这样扩展此BaseController:

@RestController
@RequestMapping(value= "/admin")
public class AdminController extends BaseController {

    @RequestMapping(
            value = "/all", 
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public ServiceResponse<List<Account>> getAll() {
        ServiceResponse<List<Account>> serviceResponse = accountService.getAll();
        return serviceResponse;
    }
}
@RestController
@请求映射(value=“/admin”)
公共类AdminController扩展了BaseController{
@请求映射(
value=“/all”,
method=RequestMethod.GET,
products=MediaType.APPLICATION\u JSON\u值)
公共服务响应getAll(){
ServiceResponse ServiceResponse=accountService.getAll();
返回服务响应;
}
}
但一旦我移动ping()resource BaseController,我就会在服务器启动时出错:

2016-04-23 21:31:39.862 ERROR 2335 --- [           main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'clientController' method 
public ca.gatin.api.response.ServiceResponse<?> ca.gatin.api.controller.BaseController.ping()
to {[/admin/ping],produces=[application/json]}: There is already 'adminController' bean method
public ca.gatin.api.response.ServiceResponse<?> ca.gatin.api.controller.BaseController.ping() mapped.
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
    at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
    at ca.gatin.TodoAppApplication.main(TodoAppApplication.java:10) [classes/:na]
2016-04-23 21:31:39.862错误2335---[main]o.s.boot.SpringApplication:应用程序启动失败
org.springframework.beans.factory.BeanCreationException:创建名为“requestMappingHandlerMapping”的bean时出错,该名称在类路径资源[org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]中定义:初始化方法调用失败;嵌套异常为java.lang.IllegalStateException:不明确映射。无法映射“clientController”方法
public ca.gatin.api.response.ServiceResponse ca.gatin.api.controller.BaseController.ping()
到{[/admin/ping],products=[application/json]}:已经有'adminController'bean方法
已映射公共ca.gatin.api.response.ServiceResponse ca.gatin.api.controller.BaseController.ping()。
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在org.springframework.beans.factory.support.DefaultListableBeanFactory.PreInstanceSingleton(DefaultListableBeanFactory.java:772)~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE]
在org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)~[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
在org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766)[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
在org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361)[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
在org.springframework.boot.SpringApplication.run(SpringApplication.java:307)[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
在org.springframework.boot.SpringApplication.run(SpringApplication.java:1191)[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
在org.springframework.boot.SpringApplication.run(SpringApplication.java:1180)[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
位于ca.gatin.todoapapplication.main(todoapapplication.java:10)[classes/:na]

只是,我不想在多个控制器中复制ping()资源。如何将其正确移动到BaseController?

我感觉您正在使用另一个控制器

class ClientController extends BaseController
ClientController和AdminController都将/ping映射到其继承的方法ping()。Spring只能映射/ping到其中一个,这就是为什么会出现异常

你在写作

我不想在多个控制器中复制ping()资源

没有必要这样做。将ping()方法放在它自己的控制器中,将其从BaseControler中删除,就这样


无论如何,我不建议在控制器中使用继承,因为它使事情变得比它所能帮助的更复杂。

我觉得你正在使用另一个继承

class ClientController extends BaseController
ClientController和AdminController都将/ping映射到其继承的方法ping()。Spring只能映射/ping到其中一个,这就是为什么会出现异常

你在写作

我不想在多个控制器中复制ping()资源

没有必要这样做。将ping()方法放在它自己的控制器中,将其从BaseControler中删除,就这样


无论如何,我不建议在控制器中使用继承,因为继承会使事情变得更加复杂,而不是有帮助。

是否希望为扩展BaseController的每个控制器都使用ping映射(<