我想调用一个包含 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 将不起作用并且字段将为空。