弹出启动时会在控制器中自动装配Feign客户端抛出异常

问题描述 投票:0回答:1

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

这是我的建筑

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

首先是我的资源项目简历

Application.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();
}

在运行客户端时,我遇到以下异常

demo.MessageController中的字段appClientFeign需要一个无法找到的类型为'org.springframework.cloud.netflix.feign.FeignContext'的bean。

  • 没有加载Bean方法'feignContext',因为@ConditionalOnClass没有找到所需的类'feign.Feign'
java spring spring-boot spring-cloud-feign
1个回答
0
投票

解释:知道spring cloud有Feign默认情况下不添加feign starter依赖项不会触发任何编译时间问题(因为使用javax jpa应该由初学者项目Data JPA注入)在我的情况下我忘了添加启动器项目pom,spring寻找他无法找到的实现或配置。

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

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
© www.soinside.com 2019 - 2024. All rights reserved.