【问题标题】:applicationContext.xml file not being read in by SpringSpring 未读入 applicationContext.xml 文件
【发布时间】:2017-11-14 12:42:48
【问题描述】:

我在 StackOverflow 中阅读了大量关于 ApplicationContextProvider 主题的示例,但我找不到一个可以解决我的问题的示例。我有一个 xml 文件,我不相信它正在被读取并初始化我在其中记录的 bean。我有以下课程:

package com.tacticalenterprisesltd.spring;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextProvider implements ApplicationContextAware
{
    @Autowired
    private static ApplicationContext context;

    public ApplicationContext getApplicationContext()
    {
        return context;
    }

    @Override
    public void setApplicationContext(ApplicationContext ac) throws BeansException {
        System.out.println("ApplicationContext Initialized");
        context = ac;
    }       
}

我的 applicationContext.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:task="http://www.springframework.org/schema/task" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">

    <mvc:annotation-driven />
    <tx:annotation-driven />
    <context:component-scan base-package="com.tacticalenterprisesltd" />
    <bean id="applicationContextProvider" class="com.tacticalenterprisesltd.spring.ApplicationContextProvider" />
    <bean id="springDatabase" class="com.tacticalenterprisesltd.spring.SpringDatabase" />

</beans>

JedSpringTestApplication:

package com.tacticalenterprisesltd.jedspringtest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@ComponentScan(basePackages = {"com.tacticalenterprisesltd"})
public class JedSpringTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(JedSpringTestApplication.class, args);

    }
}

最后是 PersonelSearch 类:

package com.tacticalenterprisesltd.jedspringtest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.tacticalenterprisesltd.Field;
import com.tacticalenterprisesltd.Query;
import com.tacticalenterprisesltd.WhereCondition;
import com.tacticalenterprisesltd.spring.ApplicationContextProvider;
import com.tacticalenterprisesltd.spring.SpringDatabase;

@Controller
public class PersonnelSearch 
{
    @Autowired
    ApplicationContextProvider applicationContextProvider ;

    @RequestMapping("/search")
    public String search(@RequestParam(value="lastname", required=true) String lastname, Model model) {
        model.addAttribute("lastname", lastname);
        SpringDatabase sd = (SpringDatabase)applicationContextProvider .getApplicationContext().getBean("springDatabase", com.tacticalenterprisesltd.spring.SpringDatabase.class);
        Query query = new Query(Query.Type.SELECT, "employees");
        Field field1 = new Field("employees", "id", Field.Type.INT);
        Field field2 = new Field("employees", "first_name", Field.Type.STRING);
        Field field3 = new Field("employees", "last_name", Field.Type.INT);
        Field field4 = new Field("employees", "email", Field.Type.INT);
        Field[] fields = new Field[4];
        fields[0] = field1;
        fields[1] = field2;
        fields[2] = field3;
        fields[3] = field4;
        query.setFields(fields);
        WhereCondition where = new WhereCondition(field3, lastname, "=");
        WhereCondition[] conditions = new WhereCondition[1];
        conditions[0] = where;
        query.setWhereConditions(conditions);
        sd.setQuery(query);
        String[][] strData = sd.executeSelect();
        String out = "";
        for(int i = 0; i < strData.length; i++)
        {
            out += " | ";
            for(int j = 0; j < strData[0].length; j++)
            {
                out += strData[i][j] + " | ";
            }
            out += "\n";
        }
        System.out.println("Table Results:\n" + out);
        return out;
    }
}

当我将它作为 Spring Boot 应用程序运行时,我得到:

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'personnelSearch': Unsatisfied dependency expressed through field 'applicationContextProvider'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.tacticalenterprisesltd.spring.ApplicationContextProvider' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
***************************
APPLICATION FAILED TO START
***************************

    Description:

Field applicationContextProvider in com.tacticalenterprisesltd.jedspringtest.PersonnelSearch required a bean of type 'com.tacticalenterprisesltd.spring.ApplicationContextProvider' that could not be found.


Action:

Consider defining a bean of type 'com.tacticalenterprisesltd.spring.ApplicationContextProvider' in your configuration.

我认为 applicationContext.xml 文件没有被读取,否则在应用程序加载时,其中记录的 bean 将可用。请指教。

【问题讨论】:

  • 去掉相等为null,像这样:ApplicationContextProvider acp;
  • 我改变了 ApplicationContextProvider acp = null;只是 ApplicationContextProvider acp;然后我再次运行应用程序。结果相同。
  • AFAIK,如果你用 @Component 注释标记一个类,spring 会为你实例化并注入 bean。您再次告诉 spring 使用 &lt;bean id="applicationContextProvider" class="com.tacticalenterprisesltd.spring.ApplicationContextProvider" /&gt; 在 applicationContext.xml 中创建相同的 bean。一个都行,能不能把上面的xml节点去掉重试一下?
  • 您正在使用 Spring Boot,因此您的 XML 文件不会被读取,除非您在 Spring 应用程序上使用 @ImportResource 显式导入它。但是,您所做的基本上是代码异味/坏习惯。您不应该使用上下文来查找 bean,而应该使用依赖注入。 (通常,当您采用此类解决方案时,您想离开键盘并再次仔细查看您的解决方案,因为您通常做错了)。
  • 您已将上下文声明为static。尝试删除static

标签: java xml spring spring-mvc


【解决方案1】:

您还没有@Autowired 您的应用程序上下文。

你需要这样做:

@Component
public class ApplicationContextProvider
{
    @Autowired
    private ApplicationContext context;

    public ApplicationContext getApplicationContext()
    {
        return context;
    }

}

【讨论】:

  • 我按照您的建议添加了注释并再次运行应用程序。它没有任何区别。我得到了同样的结果。
  • 你的类 ApplicationContextProvider 没有实现 ApplicationContextAware。
  • 你不必,你可以自动接线。
【解决方案2】:

要么将PersonnelSearch 类中的变量名称从acp 更改为applicationContextProvider,要么在PersonnelSearch 中的@Autowired 之后添加@Qualifier("applicationContextProvider") 以获得acp 变量。

例如

@Controller
public class PersonnelSearch 
{
    @Autowired
    ApplicationContextProvider applicationContextProvider;

@Controller
public class PersonnelSearch 
    {
        @Autowired
        @Qualifier("applicationContextProvider")
        ApplicationContextProvider acp;

另外,在JedSpringTestApplication 上添加@ComponentScan(basePackages = {"com.tacticalenterprisesltd"}) 为:

package com.tacticalenterprisesltd.jedspringtest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@ComponentScan(basePackages = {"com.tacticalenterprisesltd"})
public class JedSpringTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(JedSpringTestApplication.class, args);

    }
}

【讨论】:

  • 我按照建议添加了注释限定符并再次运行该应用程序。结果相同。
  • 基于到目前为止的 cmets,我已经更新了我的代码,如上所示。但是,我没有更进一步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
相关资源
最近更新 更多