1.首先说说spring 与 jpa的问题,现在想买都习惯使用maven来管理,实现分子模块,每个子模块中都自己模块的实体类,每个实体类上使用@Entity进行注解,使其能将该实体自动扫描让jpa来映射管理。但是问题出现,运气好 有部分实体能被映射成功,运气不好一个实体也不能被映射成功。经过实验,发现:persistence.xml 所在的子模块的实体类能被映射,除此之外的都不行,解决办法:不得不放弃 全注解,多配一个<entity-mappings>,将需要映射的实体类通过配置文件进行加载。当然还有其其它解决方法,如使用:<jar-file>、<class>等
2.再说说web项目中加入spring后,web.xml中的配置。
我之前在一篇文章张中说过:
applicationContext.xml 配置文件的存放位置
web.xml中classpath:和classpath*: 有什么区别?
classpath:只会到你的class路径中查找找文件;
classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找.
上确实是对的。
现在遇到的问题是:
还是maven项目中,一个项目被分成了多个子模块,每个子模块又有各自的applicationContext.xml配置文件,比如:
持久层(子模块):applicationContext-db.xml、applicationContext-mdb.xml
缓存层(子模块):applicationContext-cache.xml
控制层(子模块):applicationContext.xml、applicationContext-task.xml
等..
然后我们在web.xml 配置如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
上面的意思是:把当前classpath和jar中的classpath中以applicationContext开头的xml文件都加载进来作为spring的配置文件,但经过测试:发现只有控制层的applicationContext.xml、applicationContext-task.xml这两个配置文件成功了,其它模块的都没有加载进来。
那是什么原因呢,猜测classpath* 的*没有生效?还是applicationContext*.xml的* 没有生效,但是加载进来了 applicationContext-task.xml 文件呀,说明后者是生效了的。经过慢慢的测试终于找到了问题发生的现象,当使用classpath*时,后面的文件路径就不能带有通配符。spring去扫描jar里面的文件时,不会吧* 当成 任意字符处理的。只有使用classpath时,spring才会把文件路径中的*解析为任意字符。问题找到了,下来就来看解决办法。
首先修改web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml,classpath*:applicationContext.xml</param-value>
</context-param>
上面的意思是:
加载当前类路径下的 所有已applicationContext开头的xml , 同时加载所有jar(子模块)中的applicationContext.xml文件。
但这个配置还是没有满足我们的要求,因为子模块中 还有 applicationContext-db.xml 、applicationContext-cache.xml 等 类似的没有加载进来。
解决办法是 在对应的子模块中,增加一个 applicationContext.xml 文件(因为,根据web.xml中的配置,spring能加载每个子模块的applicationContext.xml 文件,)。然后再各个子模块中的applicationContext.xml 文件中使用<import resource> 将当期子模块的其他配置文件加载进来即可。
如:
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<import resource="applicationContext-db.xml" />
<import resource="applicationContext-mdb.xml" />
</beans>