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.
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
Myślę, że miałem problemy gdzieś pomiędzy siedzeniem i klawiaturą, ponieważ teraz działa. Dzięki. – Wes
Dzięki @Wes to pomogło mi. –