Skip to main content
 首页 » 编程设计

java之从springBoot中的不同类调用方法

2023年09月11日43pengyingh

我想调用一个包含 applicationContext 的方法,该方法在独立运行时工作正常,但当我尝试从不同的类调用它时 appContext.getBean(DataSource.class) 返回 null。

public class Action { 
 
private static Logger log = LoggerFactory.getLogger(Action.class); 
 
@Autowired 
MessageConfigProperties messageProperties; 
 
@Autowired 
AutomatorApp automatorApp; 
 
@Autowired 
Apps gapps; 
 
@Autowired 
Deploy d; 
 
@Autowired 
Deploy depstatusChk; 
 
@Autowired 
private ApplicationContext appContext; 
 
@Autowired 
CreateSaltFileService createSaltFile; 
 
@Autowired 
DeployFactory depFactory; 
 
@Autowired 
IMoveAppsService moveAppsService; 
 
@Autowired 
IUserEnvironmentService userEnvService; 
 
@Autowired 
IEnvironmentService envService; 
 
@Autowired 
Session session; 
 
private Logger logger = LoggerFactory.getLogger(Action.class); 
private ServletContext context; 
 
@Context 
public void setServletContext(ServletContext context) { 
    System.out.println("servlet context set here"); 
    this.context = context; 
} 
 
@POST 
@Path("/register/") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
@RequiresRoles("admin") 
@RequiresPermissions("automator:register") 
public Session register(Session credentials, @BeanParam Session springContext) throws AppException { 
    System.out.println("into action class"); 
    System.out.println("-->>>" +appContext.getBean(DataSource.class)); 
    appContext.getBean(DataSource.class); 
    logger.info(messageProperties.getGreetings()); 
    // logger.trace("Inside Session"); 
    System.out.println("Inside Session"); 
    credentials.setDatasource(springContext.getDatasource()); 

当这个Action方法被调用时

这个方法agentGroup在不同的类

@POST 
@Produces(MediaType.APPLICATION_JSON) 
@ApiOperation(value = "Get List of agent group", response =  
AgentGroup.class, responseContainer = "List") 
public ArrayList<AgentGroup> agentGroup(Session credentials, @BeanParam Session springContext) throws AppException, ConfigException, InterruptedException { 
 
    Session r=objA.register(credentials, springContext); 
    int sessionId=r.getSessionId(); 
} 

请您参考如下方法:

@Autowire ApplicationContext appContext只是为了获取数据源(appContext.getBean(DataSource.class))。

为什么不直接@Autowire DataSource 数据源? 它将使您的 Action 类的业务逻辑独立于 Spring。

如果你真的想访问ApplicationContext,你可以尝试另一种方法

使 Action 实现 ApplicationContextAware

私有(private)ApplicationContext ctx;

  @Override 
    public void setApplicationContext(ApplicationContext applicationContext) 
            throws BeansException { 
        ctx = applicationContext; 
    } 

参见 Circular dependency in Spring了解详情。

编辑: 您的 Action 类没有注释。没有 org.springframework.web.bind.annotation。 RestController,没有 @Component@Service。你确定它是由Spring管理的吗?如果它只是使用 new 创建的,那么 Autowire 将不起作用并且字段将为空。