当春季启动时,在我的控制器中自动连接 Feign 客户端抛出异常



我已经尝试了这个和这个的解决方案,但没有成功,所以也许我错过了其他东西

这是我的架构

我有一个受 Oauth2 保护的 ressource 微服务,它正在实现我的业务逻辑,还有一个客户端微服务,其中包含一个使用这个资源的 thymleaf 模板。使用 Oauth2RestTemplate 很好,现在我正在尝试使用假装。

首先是我的资源项目简历

应用.yml

spring.application.name: COMPONENTS
server:
port: 0


eureka.client.service-url.defaultZone: xxxxxxxxxxxxxxxxxxxxxxxx
security.oauth2.resource.token-info-uri: xxxxxxxxxxxxxxxxxxxxxx
security.oauth2.client.client-id: xxxxxxxxxxxxxx
security.oauth2.client.client-secret: xxxxxxxxxxxxx
spring.jackson.date-format: com.fasterxml.jackson.databind.util.ISO8601DateFormat

spring:
datasource:
url: jdbc:mariadb://localhost:3306/pos_auth?createDatabaseIfNotExist=true
username: root
password: xxxxxxxx
driver-class-name: org.mariadb.jdbc.Driver

和一个简单的控制器

@Controller
@RequestMapping(ApplicationController.API)
public class ApplicationController {

public static final String API = "applications";

@Autowired
private ComponentsService componentsService;

@GetMapping
public ResponseEntity<List<Apps>> getApplicationsList() {
return new ResponseEntity<List<Apps>>(componentsService.getAllApps(), HttpStatus.OK);
}

}

现在这里是我的客户端 Feign 客户端实现的重要部分

主类

@SpringBootApplication
@EnableOAuth2Sso
@EnableEurekaClient
@EnableDiscoveryClient
@EnableWebSecurity
public class ClientApplication extends WebSecurityConfigurerAdapter{

public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}


@Override
protected void configure(HttpSecurity http) throws Exception {
http
.logout()
.logoutSuccessUrl("http://localhost:9999/uaa/exit");
http.authorizeRequests().antMatchers("/graphics/**").permitAll().
and().authorizeRequests().anyRequest().authenticated();
}

@Bean
@LoadBalanced
OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext, OAuth2ProtectedResourceDetails details) {
return new OAuth2RestTemplate(details, oauth2ClientContext);
}
@Profile("!cloud")
@Bean
RequestDumperFilter requestDumperFilter() {
return new RequestDumperFilter();
}
}

假装配置

@Configuration
@EnableFeignClients
@ImportAutoConfiguration({RibbonAutoConfiguration.class, FeignRibbonClientAutoConfiguration.class, FeignAutoConfiguration.class})
public class FeignConfig {
}

调用索引时我在客户端控制器中所需的行为

@Controller
public class MessageController {
@Autowired
OAuth2RestTemplate restTemplate;

@Autowired
private AppClientFeign appClientFeign;

@RequestMapping("/")
String home(Model model) {
model.addAttribute("applications", appClientFeign.getApps());
System.out.println(appClientFeign.getApps());
return "index";
}

}

终于我的假装客户

@FeignClient("COMPONENTS")
public interface AppClientFeign {
@RequestMapping(method = RequestMethod.GET, value = "/applications")
List<App> getApps();
}

运行客户端时出现以下异常

Field appClientFeign in demo.消息控制器需要类型的 Bean "org.springframework.cloud.netflix.feign.FeignContext"不能 被发现。

  • Bean 方法 'feignContext' 未加载,因为@ConditionalOnClass没有找到所需的类 'feign。假装'

解释:知道Spring Cloud默认有Feign不添加假装启动器依赖项不会触发任何编译时间问题(因为使用Javax JPA应该由初学者项目数据JPA注入(在我的情况下,我忘了将启动器添加到项目pom中,春季搜索他找不到的暗示或图形。

解决方案添加启动器假装依赖项

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

对于高于 2.0.0.M4的 Spring 引导版本,请使用

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

最新更新