2015-05-14 18 views
10

Mam problem z automatycznym okablowaniem klienta feign z innego projektu. Wygląda na to, że implementacja fałszywego klienta nie jest generowana i wstrzykiwana.Błąd Wstrzykiwanie FeignClient z innego projektu

To jest błąd, który otrzymuję.

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'passportRestController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: private com.wstrater.service.contacts.client.ContactService com.wstrater.service.passport.server.controllers.PassportRestController.contactService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [com.wstrater.service.contacts.client.ContactService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: 
{@org.springframework.beans.factory.annotation.Autowired(required=true)} 

Fałszywy klient jest całkiem prosty. Zwiększyłem przywóz w celu zachowania zwięzłości.

package com.wstrater.service.contacts.client; 

@FeignClient("contact-service") 
public interface ContactService { 

    @RequestMapping(method = RequestMethod.GET, value = ContactConstants.CONTACTS_USER_ID_PATH) 
    public Collection<Contact> contactsByUserId(@PathVariable("userId") String userId); 

} 

dodałem skanowania komponentów do mojego projektu obejmuje aplikację i to kontrolery i obejmują udawaj klienta w innym projekcie.

package com.wstrater.service.passport.server; 

@EnableEurekaClient 
@EnableFeignClients 
@SpringCloudApplication 
@ComponentScan({"com.wstrater.service.passport.server", 
       "com.wstrater.service.contacts.client"}) 
public class PassportServiceApplication { 

    public static void main(String[] args) { 
    ApplicationContext ctx = SpringApplication.run(PassportServiceApplication.class, args); 
    } 

} 

Reszta kontroler z większością importu usunięte dla zwięzłości.

package com.wstrater.service.passport.server.controllers; 

import com.wstrater.service.contacts.client.ContactService; 

@RestController 
public class PassportRestController { 

    @Autowired 
    private ContactService contactService; 

    @RequestMapping(PassportContstants.PASSPORT_USER_ID_PATH) 
    public ResponseEntity<Passport> passportByUserId(@PathVariable String userId) { 
    ResponseEntity<Passport> ret = null; 

    Collection<Contact> contacts = contactService.contactsByUserId(userId); 
    if (contacts == null || contacts.isEmpty()) { 
     ret = new ResponseEntity(HttpStatus.NOT_FOUND); 
    } else { 
     ret = ResponseEntity.ok(new Passport(contacts)); 
    } 

    return ret; 
    } 

} 

Próbowałem definiowania udawaj interfejs klienta w różnych projektach i różnych pakietów i widziałem tylko sukces, jeśli umieścić go w tym samym opakowaniu co aplikacja. Należy przypuszczać, że jest to problem ze skanowaniem komponentów, mimo że dołączam pakiet do skanowania. Chciałbym zachować interfejs użytkownika feign w projekcie współdzielonym, aby zdefiniować "kontrakt" wielokrotnego użytku i dla każdego projektu mieć unikalną strukturę pakietu, zamiast definiować klienta typu feign przy użyciu aplikacji.

Dzięki, Wes.

Odpowiedz

21

Musisz poinformować skaner Feign, gdzie zlokalizować interfejsy.

Można użyć @EnableFeignClients(basePackages = {"my.external.feign.client.package", "my.local.package"}).

+0

Dzięki. Zrobiłem to szybko, ponieważ coś innego tylko pojawiło się, ale nie widzę różnicy. Przeniosłem listę pakietów z ComponentScan do EnableFeignClients. '@EnableFeignClients (basePackages = {" com.wstrater.service.passport.server "," com.wstrater.service.contacts.client "})'. Nadal dostaję błąd. – Wes

+0

Myślę, że miałem problemy gdzieś pomiędzy siedzeniem i klawiaturą, ponieważ teraz działa. Dzięki. – Wes

+0

Dzięki @Wes to pomogło mi. –

0

nazwa bezpośrednie Klasa/Interfejs może być udzielona jak poniżej

@EnableFeignClients(basePackageClasses=com.abc.xxx.client.XXFeignClient.class) 

Ten parametr akceptuje pojedynczych lub wielokrotnych nazwa klasy