Java @来自Spring Boot的自动连线服务在WAR中为空
首先,对于给您带来的不便,我深表歉意。我进行此咨询是因为我花了几天时间处理此问题,但没有找到正确的解决方案。我有一个名为fact electronica api的项目,它是使用swagger codegen设计的,通过它我有执行REST调用的路径。一旦用户进行了这种类型的调用,api项目将与另一个项目进行通信,该项目具有使用Spring Boot的内核,并使用数据库执行查询。我的问题是,当我从api自动连接到核心中定义的服务时,这是空的 请原谅我的英语,我来自乌拉圭,我希望你理解我面临的问题。为了进一步了解,我附上了图片 事实电子Api Factelec核 我通过它接收rest呼叫并与core通信的服务 核心服务 对核心api的依赖 Spring启动初始值设定项,当您在wildfly中启动ear时,此项目将自动启动并进行相关设置 如果有人能指导我解决这个问题,我会很感激,谢谢你。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自动连接到核心中定义的服务时,这是空的 请原谅我的英语,我来自乌拉圭,我希望你理解我面临的问题。为
好像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);