当前位置: 首页 > 知识库问答 >
问题:

使用Spring mvc 与Spring网流不使用Spring护套

戚祺
2023-03-14

所以我有一个旧的工作应用程序,它使用SpringMVC而不是Springboot。我在我的项目中添加了spring-webflux的gradle依赖项,并开始使用webclient从我的项目调用外部API。这是我的webclient处理程序类:

@Service
public class WebclientHandler {
    private final WebClient webClient;

    public WebclientHandler (WebClient.Builder builder) {
        this.webClient = builder.baseUrl("baseurl").build();
    }
}

现在,当我通过我的API调用此代码后,我收到了这个错误:

通过构造函数参数 0 表示的未满足依赖关系;嵌套的例外是组织.Spring框架.豆.工厂.NoSuchBean定义异常: 没有 '组织.Spring框架.web.反应式.函数.client.WebClient$Builder' 类型的合格 Bean 可用:预计至少有 1 个符合自动布线候选条件的 Bean。依赖项注释: {}

我的应用程序似乎找不到Webclient.builder,构造函数注入也没有发生。这是因为我没有使用Spring启动吗?

这是我的Gradle依赖关系:

compile(group: 'org.springframework', name: 'spring-webflux', version: '5.3.15')

我是spring-webflux反应式编程的新手。

编辑

我也尝试过使用配置创建Web客户端豆:

 @Configuration
    public class WebClientHandler {
    
    @Bean
        public WebClient myWebClient() {
            WebClient client = WebClient.builder().baseUrl("baseUrl")
                    .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                    .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
                    .build();
            return client;
        }
}

现在我在启动时收到了这个异常:

{ java.lang.IllegalStateException: No suitable default ClientHttpConnector found
    at org.springframework.web.reactive.function.client.DefaultWebClientBuilder.initConnector(DefaultWebClientBuilder.java:297)
    at org.springframework.web.reactive.function.client.DefaultWebClientBuilder.build(DefaultWebClientBuilder.java:266)
    at com.kronos.orgmap.sbs.impl.service.WebClientHandler.MyWebClient(WebClientHandler.java:41)
    at com.kronos.orgmap.sbs.impl.service.WebClientHandler$$EnhancerBySpringCGLIB$$59a9a582.CGLIB$desiWebClient$0(<generated>)
    at com.kronos.orgmap.sbs.impl.service.WebClientHandler$$EnhancerBySpringCGLIB$$59a9a582$$FastClassBySpringCGLIB$$76fa510d.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331)
    at com.kronos.orgmap.sbs.impl.service.WebClientHandler$$EnhancerBySpringCGLIB$$59a9a582.MyWebClient(<generated>)
    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:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    at org.springframework.beans.factory.support.KronosConstructorResolver.instantiate(KronosConstructorResolver.java:654)
    at org.springframework.beans.factory.support.KronosConstructorResolver.instantiateUsingFactoryMethod(KronosConstructorResolver.java:487)
    at org.springframework.beans.factory.support.KronosAbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(KronosAbstractAutowireCapableBeanFactory.java:1345)
    at org.springframework.beans.factory.support.KronosAbstractAutowireCapableBeanFactory.createBeanInstance(KronosAbstractAutowireCapableBeanFactory.java:1193)
    at org.springframework.beans.factory.support.KronosAbstractAutowireCapableBeanFactory.doCreateBean(KronosAbstractAutowireCapableBeanFactory.java:611)
    at org.springframework.beans.factory.support.KronosAbstractAutowireCapableBeanFactory.createBean(KronosAbstractAutowireCapableBeanFactory.java:559)
    at org.springframework.beans.factory.support.KronosAbstractBeanFactory.lambda$doGetBean$0(KronosAbstractBeanFactory.java:336)
    at org.springframework.beans.factory.support.KronosDefaultSingletonBeanRegistry.getSingleton(KronosDefaultSingletonBeanRegistry.java:235)
    at org.springframework.beans.factory.support.KronosAbstractBeanFactory.doGetBean(KronosAbstractBeanFactory.java:334)
    at org.springframework.beans.factory.support.KronosAbstractBeanFactory.getBean(KronosAbstractBeanFactory.java:209)
    at org.springframework.beans.factory.support.KronosDefaultListableBeanFactory.preInstantiateSingletons(KronosDefaultListableBeanFactory.java:952)
    at com.kronos.container.impl.startup.KronosBeanFactory.preInstantiateSingletons(KronosBeanFactory.java:226)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:401)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:292)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4699)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1125)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1859)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
 } }

共有2个答案

段劲
2023-03-14

您只能使用“spring boot starter webflux”:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.7.4</version>
</dependency>

宋飞舟
2023-03-14

在我的gradle中添加这些依赖关系为我解决了第二种方法的问题,现在默认WebClientBuilder能够启动webclient builder使用的连接器。

implementation platform('io.projectreactor:reactor-bom:2020.0.17')
    implementation 'io.projectreactor.netty:reactor-netty-core' 
    implementation 'io.projectreactor.netty:reactor-netty-http'

虽然仍然没有弄清楚为什么即使在添加上述gradle依赖项之后,第一种方法也不起作用。仍然无法在构造函数中找到Web客户端生成器类作为bean。

 类似资料:
  • 我试图让Ehcache 3在不使用Spring Boot的情况下与Spring 4一起工作。 这里有一个使用Spring Boot的工作示例,但是我正在处理一个不使用Spring Boot的现有应用程序。 问题在于,sping-encent-support(它添加了Spring的缓存注释)期望Ehache的CacheManager位于这个类路径上:net.sf.ehcache.CacheManag

  • 这在支持Servlet3.0的容器中运行良好。 但是,当我们使用带有JAX-RS(Jersey)的Spring Boot时,为什么我们必须从扩展,为什么从扩展不起作用?

  • 我目前想用Spring Cloud Gateway来保护我的微服务架构。有网页前端工程师向KeyCloak服务器验证自己,然后将令牌与每个请求一起发送。现在的情况是,只有网关应该对外公开,而单个服务将无法从外部访问。 如何在密钥斗篷服务器上验证承载令牌? 我已经在互联网上搜索了一段时间,但还没有找到任何验证令牌的内容。在任何地方,身份验证都是通过网关完成的,然后令牌由各个服务进行验证。然而,当我将

  • 有没有办法只使用spring security实现CSRF保护,而不使用身份验证和授权等其他功能? 我尝试了以下配置,但它关闭了spring security的所有功能。想知道是否有一种方法可以配置csrf功能。

  • 我正在尝试为我的Spring应用程序实现一个REST API。因为有些资源可能不是每个人都可以访问的,所以我需要一个安全层。 我不知道该如何进行。使用Spring Security保护REST API的最佳方法是什么?

  • 当登录失败时,我试图重定向登录页面上输入的用户名,但在我的控制器中,从“@modelattribute(”user“)”检索的用户的用户名为空。当我不使用spring security时,这是有效的。 我假设form实际上首先发送到spring security,然后重定向到控制器,因此在spring security之间输入的信息丢失。 编辑(解决方案): 谢谢。@James创建一个failur