2016-04-24 2 views
0

У меня есть BaseController:Как создать общий ресурс API '/ ping' в абстрактном BaseController?

@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 так:

@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; 
    } 
} 

Но как только я переехал пинг() ресурс 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] 

Это просто, я не хочу дублировать ресурс ping() в нескольких контроллерах. Как я могу переместить его на BaseController правильно?

+0

Вы хотите, чтобы для каждого контроллера, который расширяет BaseController ('admin/ping', например), требуется сопоставление ping? Или одно сопоставление '/ ping', независимо от того, сколько подклассов BaseController вы создаете? –

+0

Я хочу, чтобы метод ping был в корне requestMapping like/ping –

ответ

1

Я tlooks, как вы используете другой

class ClientController extends BaseController 

Оба ClientController и AdminController карта/пинг их унаследованный метод пинг(). Spring может отображать/пинговать только на тот или другой, вот почему вы получаете исключение.

Вы пишете

Я не хочу, чтобы дублировать пинг() ресурс в нескольких контроллеров

и нет необходимости делать это. Поместите свой метод ping() в свой собственный контроллер, удалите его из BaseControler и тем самым.

В любом случае, я бы не рекомендовал использовать наследование в контроллерах, это делает вещи в основном более сложными, чем помогает.

+0

Спасибо за ваш ответ! Да, вы правы, и ClientController и AdminController расширяют BaseController. Если я поставлю метод ping() в ClientController и AdminController, тогда это будет дублирование одного и того же метода в них для контроллеров ... –

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