属性文件未加载

19 浏览
0 Comments

属性文件未加载

我有两个项目,CarpoolDB和Carpool。

CarpoolDB包含后端内容,并且具有以下文件:

carpool-application-context.xml




server.properties

cm.db.driverClassName=com.mysql.jdbc.Driver
cm.db.url=jdbc:mysql://localhost:3306/carpool1
cm.db.username=abc
cm.db.password=xyz

我创建了一个CarpoolDB的jar文件,并放置在Carpool Application中。

Carpool包含UI内容,并与后端联系CarpoolDB jar文件,具有以下文件:

carpool-application-context1.xml




spring-servlet.xml

 


carpool.properties

cm.email.sender.mail.smtp.host=mail.on.com

现在,我有一个类com.onmobile.carpool.util.EmailSender,它有一个属性smtpHost,我希望使用Spring的@Value注解来注入该属性的值,但它没有被注入。

@Controller
public class EmailSender {
    public static final Log logger = LogFactory.getLog(EmailSender.class);
    @Value("${cm.email.sender.mail.smtp.host}")
    private String smtpHost;
}

我得到了以下错误:

java.lang.IllegalArgumentException: Could not resolve placeholder 'cm.email.sender.mail.smtp.host'

carpool.properties存在于src文件夹中。

为什么它没有从carpool.properties文件中获取cm.email.sender.mail.smtp.host的值?是否与jar文件中存在的属性文件有关。

实际上,属性文件已加载,因为我在日志中没有看到文件找不到的消息,但字段没有被自动装配。

0
0 Comments

问题出现的原因是因为在carpool-application-context.xml文件中有配置,该文件被carpool-application-context1.xml导入,因此强制将控制器创建在根Web应用程序上下文中,因为"com.onmobile"包括"com.onmobile.carpool.controller",并且没有property-placeholder配置项在根上下文中。在servlet上下文(spring-servlet.xml)中有一个property placeholder配置项。property placeholder配置器(由标签定义)是bean后处理器,它们按容器的基础工作,因此它们不能修改它们未定义在其中的上下文的bean定义。因此,它不能修改在根上下文(carpool-application-context.xml,carpool-application-context1.xml)中声明的控制器实例的bean定义。因此,由于双重扫描,您的控制器被创建了两次 - 在根和servlet上下文中,只有一个被正确的placeholder配置器处理。

解决方法是在component-scan中使用过滤器表达式,只在spring-servlet.xml中选择使用@Controller注释的类,并从carpool-application-context.xml/carpool-application-context1.xml中排除它们。

请保持您的Spring配置简单,您的配置非常令人困惑。

更新:您将控制器(使用@Controller注释)与服务(应在util包中使用@Service注释)混淆了。我的建议是将服务移动到根Web应用程序上下文(carpool-application-context1.xml)中,并在那里放置property placeholder配置器的声明。

问题可能是标签被markdown吞掉了,我会在使用电脑时解决它。问题是第一个配置文件扫描了"com.onmobile",其中包括具有value注解的控制器类。配置器未在根上下文中定义(处理appcontext和appcontext1文件),情况类似于答案中的第一个链接。根上下文中没有属性占位符配置器,servlet上下文中的配置器无法处理错误地在根上下文中创建的控制器,因为后处理器按照每个应用程序上下文的基础工作。

您需要在声明控制器的同一个应用程序上下文中拥有property placeholder配置器。

您确定carpool-application-context.xml已经退出游戏了吗?

0