gpt4 book ai didi

spring - 属性文件未加载

转载 作者:行者123 更新时间:2023-12-04 05:13:19 24 4
gpt4 key购买 nike

我有两个项目,CarpoolDB 和 Carpool。

CarpoolDB : 包含后端的东西并且有

拼车应用程序上下文.xml

<context:annotation-config />
<context:component-scan base-package="com.onmobile" />
<context:property-placeholder location="classpath: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

我制作了一 jar carpoolDB 并放入 Carpool Application

拼车:包含 UI 事物和后端联系人 carpoolDB jar,并具有

carpool-application-context1.xml
<import resource="classpath:carpool-application-context.xml"/>
<context:annotation-config />
<context:component-scan base-package="com.onmobile.carpool.authentication" />

spring-servlet.xml
<context:property-placeholder location="classpath:carpool.properties" /> 

<context:annotation-config />
<context:component-scan base-package="com.onmobile.carpool.controller, com.onmobile.carpool.util" />

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

现在,我有一个类 com.onmobile.carpool.util.EmailSender,它有一个属性 smtpHost,并希望 Spring 使用 @Value 注入(inject)该值,但它没有被注入(inject)。
@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 文件中存在的属性文件是否有任何关系。

实际上,属性文件已加载,因为我在日志中看不到文件未找到但字段未自动连接。



删除导入后发布更新的完整配置文件

web.xml
  <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/carpool-application-context1.xml
/WEB-INF/applicationContext-security.xml
</param-value>
</context-param>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/jsp/*</url-pattern>
</servlet-mapping>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>

carpool-application-context1.xml
<!-- Configure annotated beans --> 
<context:annotation-config />
<context:component-scan base-package="com.onmobile.carpooldb.db" />
<context:property-placeholder location="classpath:carpool.properties" />


<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<beans:property name="driverClassName"><beans:value>${cm.db.driverClassName}</beans:value></beans:property>
<beans:property name="url"><beans:value>${cm.db.url}</beans:value></beans:property>
<beans:property name="username"><beans:value>${cm.db.username}</beans:value></beans:property>
<beans:property name="password"><beans:value>${cm.db.password}</beans:value></beans:property>
<beans:property name="testOnBorrow"><beans:value>true</beans:value></beans:property>
<beans:property name="testOnReturn"><beans:value>true</beans:value></beans:property>
<beans:property name="validationQuery"><beans:value>select 1</beans:value></beans:property>
<beans:property name="maxIdle"><beans:value>-1</beans:value></beans:property>
<beans:property name="maxActive"><beans:value>-1</beans:value></beans:property>
<beans:property name="maxOpenPreparedStatements"><beans:value>-1</beans:value></beans:property>
<beans:property name="maxWait"><beans:value>30000</beans:value></beans:property>
</beans:bean>

//session factory bean and other configuration

spring-servlet.xml
<context:property-placeholder location="classpath:carpool.properties" />

<context:annotation-config />
<context:component-scan base-package="com.onmobile.carpool.authentication, com.onmobile.carpool.controller, com.onmobile.carpool.util" />


<!-- Declare a view resolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<!-- one of the properties available; the maximum file size in bytes -->
<property name="maxUploadSize" value="100000"/>
</bean>

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

user.profile.pic.base.folder=D:\\carpoolRepository\\carpoolProfilePicUpload
google.places.autocomplete.response.xml.base.folder=D:\\carpoolRepository\\googleMapXML

#EMAIL - FORGOT PASSWORD
cm.email.sender.mail.smtp.host=mail.on.com

我试图在上面提到的 EmailSender“smtpHost”属性方式中注入(inject) cm.email.sender.mail.smtp.host 的值,当我读到它时它显示为 null。
其他属性(如 cm.db.driverClassName 等)会正确注入(inject) carpool-application-context1.xml。

我正在附上包含配置文件位置的快照 enter image description here

最佳答案

你有 <context:component-scan base-package="com.onmobile" />carpool-application-context.xmlcarpool-application-context1.xml 导入这样会强制在根 Web 应用程序上下文中创建 Controller ,因为 "com.onmobile"包括"com.onmobile.carpool.controller" , 并且没有 property-placeholder the root context 的配置.

您在 servlet 上下文(spring-servlet.xml)中有一个属性占位符配置器。属性占位符配置器(由 context:property-placeholder 标签定义)是 bean 后处理器,基于每个容器工作,因此它们无法修改未定义的上下文的 bean 定义。因此它无法修改 Controller 的 bean 定义在根上下文中声明的实例(carpool-application-context.xml、carpool-application-context1.xml)。因此,由于双重扫描,您的 Controller 被创建了两次 - 在根和 servlet 上下文中,并且只有一个由正确的占位符配置器处理。

作为修复,您可以在组件扫描中使用过滤器表达式来获取 @Controller仅在 spring-servlet.xml 中的注释类, 并将其从 carpool-application-context.xml 中排除/carpool-application-context1.xml
@Service are constructed twice过滤器示例

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

更新 你混淆了 Controller (用 @Controller 注释,我认为应该更好地放入 aaa.bbb.controllers 包)和应该用 @Service 注释的服务在 util包裹。我的建议是将您的服务移动到根 Web 应用程序上下文(carpool-application-context1.xml)并将属性占位符配置器声明放在那里。

关于spring - 属性文件未加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14619515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com