2015-04-26 2 views
0

Я пытаюсь настроить весну, чтобы использовать функции scala для контроллеров REST.API-интерфейс Spring RESTful :: Использование признаков для методов @RestController

Предположим, мне нужны 2 ресурса: автор и публикация. Вот автор:

AuthorController.java 
@RestController 
class AuthorController extends BaseController 
    with ReadTrait 
{ 
    def getSuffix(): String = { 
    "author" 
    } 
} 

и вот публикации:

PublicationController.java 
@RestController 
class PublicationController extends BaseController 
    with ReadTrait 
{ 
    def getSuffix(): String = { 
    "publication" 
    } 
} 

они оба используют для чтения черты.

и считывающего черта мне нужно для обоих:

ReadTrait.java 
@RestController 
trait ReadTrait { 

    def getSuffix(): String 

    @Secured(Array("ROLE_USER")) 
    @RequestMapping(value = Array("/{resource}"), method = Array(RequestMethod.GET)) 
    def read(@PathVariable("resource") resource: String): Author = { 

    if (resource == "author") { 
     // ... 
    } 
    } 
} 

Таким образом, проблема, что я столкнулся в том, что весна взрывается, когда эти 2 класса используют один и тот же признак с этим:

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 found. Cannot map 'publicationController' bean method 
public abstract com.example.project.core.Author com.example.project.api._trait.ReadTrait.read(java.lang.String) 
to {[/{resource}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'authorController' bean method 
public abstract com.example.project.core.Author com.example.project.api._trait.ReadTrait.read(java.lang.String) mapped. 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
     at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) 
     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:957) 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:946) 
     at com.example.project.Application.main(Application.java:10) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:497) 
     at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'publicationController' bean method 
public abstract com.example.project.core.Author com.example.project.api._trait.ReadTrait.read(java.lang.String) 
to {[/{resource}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'authorController' bean method 
public abstract com.example.project.core.Author com.example.project.api._trait.ReadTrait.read(java.lang.String) mapped. 
     at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:212) 
     at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:184) 
     at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:144) 
     at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:123) 
     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:126) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) 
     ... 21 common frames omitted 

Все строит отлично и работает как ожидалось, когда я удаляю один из контроллеров. Он также строит отлично, но не работает, если я удалю аннотацию @RestController в ReadTrait. Является ли подход, который я пытаюсь сделать неправильно? Как я могу заставить его работать?

Благодаря

ответ

1

Вы путаете Spring Ботинок с несколькими RestController без отличительного отображения.

Вы должны назначить разные значения RequestMapping для каждого класса RestController.

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