Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @来自Spring Boot的自动连线服务在WAR中为空_Java_Spring_Spring Boot_Rest_Swagger - Fatal编程技术网

Java @来自Spring Boot的自动连线服务在WAR中为空

Java @来自Spring Boot的自动连线服务在WAR中为空,java,spring,spring-boot,rest,swagger,Java,Spring,Spring Boot,Rest,Swagger,首先,对于给您带来的不便,我深表歉意。我进行此咨询是因为我花了几天时间处理此问题,但没有找到正确的解决方案。我有一个名为fact electronica api的项目,它是使用swagger codegen设计的,通过它我有执行REST调用的路径。一旦用户进行了这种类型的调用,api项目将与另一个项目进行通信,该项目具有使用Spring Boot的内核,并使用数据库执行查询。我的问题是,当我从api自动连接到核心中定义的服务时,这是空的 请原谅我的英语,我来自乌拉圭,我希望你理解我面临的问题。为

首先,对于给您带来的不便,我深表歉意。我进行此咨询是因为我花了几天时间处理此问题,但没有找到正确的解决方案。我有一个名为fact electronica api的项目,它是使用swagger codegen设计的,通过它我有执行REST调用的路径。一旦用户进行了这种类型的调用,api项目将与另一个项目进行通信,该项目具有使用Spring Boot的内核,并使用数据库执行查询。我的问题是,当我从api自动连接到核心中定义的服务时,这是空的

请原谅我的英语,我来自乌拉圭,我希望你理解我面临的问题。为了进一步了解,我附上了图片

事实电子Api Factelec核 我通过它接收rest呼叫并与core通信的服务

核心服务

对核心api的依赖

Spring启动初始值设定项,当您在wildfly中启动ear时,此项目将自动启动并进行相关设置

如果有人能指导我解决这个问题,我会很感激,谢谢你。

好像Apple TrasPaseServielMPL不是一个Spring bean,所以Spring不会考虑用AuoWORD注释所有类的字段来进行依赖注入。尝试将该类注释为@Service,以将该类的实例添加到Spring上下文或为其创建工厂 生成Spring代理而不是简单对象的RequestUdapiServiceLMPL。

您没有创建RequestUdapiServiceLMPL Spring实例

Spring context witch使@Autowired工作需要您创建被认为是Spring的实例,而不是使用java本机新的RequestUdapiServiceLMPL

您可以使用许多技术创建该实例,这里有一些技术:

不建议使用手动连接的静态上下文 公共班机{ 私有静态配置应用程序上下文上下文; 公共静态无效字符串[]args{ context=SpringApplication.runMyApplication.class,args; } 公共静态配置ApplicationContext getContext{ 返回上下文; } } 公共类requestudapiservicelmpl{ private ConfigurableApplicationContext context=Main.getContext; private RequestUdinFormacionService solInfServ=context.getBeanSonsolicitudInformacionService.class; //现在'solInfServ'不再为null。 // ... } 在Spring上下文中创建RequestUdapiServiceLMPL实例 @组成部分 公共类SomeClassWithSpringContext{ @自动连线的私有请求API服务LMPL请求服务; //有了这个@Autowired应该可以在'service'实例中工作。 } 或使用上下文实例:

@组成部分 公共类SomeClassWithSpringContext{ @自动连线专用WebApplicationContext上下文; 公共无效某些方法或某些位置{ requestudapiservicelmpl service=context.getbeanonsolicitudapiservicelmpl.class; //有了这个@Autowired应该可以在'service'实例中工作。 } }
在努里奥·费尔南德斯(Nurio Fernández)和安德烈·科夫罗夫(Andrei Kovrov)给我的帮助下,我找到了完成我想做的事情的正确方法

首先,我将Spring集成到api中,而不仅仅是集成到核心中,将Spring引导从核心移动到api中,从而在api中实现了这个类

Api-ApplicationInitializer.java

完成此操作后,使用requestudapiserviceimpl,我可以执行以下操作来调用特定时间所需的bean:

Api-requestudapiserviceimpl.java

ApplicationContext cont = AppContextUtil.getContext();
SolicitudInformacionService solInfServ = cont.getBean(SolicitudInformacionService.class);

我不知道这是否是一种理想的方法,但在我的情况下,它对我有效,如果有人有更好的方法,请随时告诉我,以便我可以改进代码。多谢各位

您好,非常感谢您的回复,我尝试了两种解决方案。第二种解决方案是实例中的一种,因为核心不依赖api,所以我无法导入类requestudapiservicelmpl。在第一个例子中,由于某种原因,上下文是空的。可能是因为core扩展到了SpringBootServletInitializer吗?您好,非常感谢您的回复。尝试使用注释@Service,但它仍然没有检测到它,您能再给我一点帮助吗?您的requestudapiservicelmpl是用@requestscope注释的。我不是JEE方面的专家,但我可以假设对象生命周期是每个请求的生命周期。而且,它不是一个对象,它是一个代理,可能是JDK代理。你用这个注释来注释服务的目的是什么?是的,它有那个注释,但为了证明你的建议,我把它去掉了。事实上,在创建服务器存根时,swagger插入了注释,我怀疑是保留注释还是取出注释。注释是否与@Service一起工作,而与@requestscope一起工作?不,我调试注释,SolinServ为null。
@Component
public class AppContextUtil implements ApplicationContextAware {
    
    @Autowired 
    private WebApplicationContext context;

    private static ApplicationContext appContext;
    
    @PostConstruct
    public void init() {
        if (context != null) {
            setApplicationContext(context);         
        }
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        AppContextUtil.appContext = applicationContext;
    }

    public static ApplicationContext getContext() {
        return appContext;
    }
}
ApplicationContext cont = AppContextUtil.getContext();
SolicitudInformacionService solInfServ = cont.getBean(SolicitudInformacionService.class);