spring mvc 注解配置+mvc注解问题.启动报错,求教

您现在的位置: >
spring MVC注解模式的经典实现
&&& &&& &&&
& & & & &大家好,我是IT学习者的螃蟹,前两天写了一个spring MVC的注解实例,目前看来下载使用的人数已有不少,使用过程中也有不少人对其中的配置存有一些不解和疑问,在这里螃蟹就那个实例中的spring配置详细说明一下,算作是对spring注解模式的一次全方位解析。
& & & & &在实例中spring的配置非常简单而且非常实用,毕竟我们是从搭建框架的根本开始,还没有整合其它高级应用,内容也就略显少了一些。也正因此,成为spring注解模式的最佳入门教材。
& & & & &我们先看一张图
& & & & &从图中可以看到,spring的主配置文件applicationContext.xml不过一百来行,配置了几个必须的bean,然后在项目启动的时候加载这个配置文件就可以了。如果在图中看不清的可以去看下实例的源码,在文件结尾处有下载页的链接。
& & & & &spring开启注解的配置如下:
&!-- 开启自动扫描 --&
&context:annotation-config/&&
&context:component-scan base-package=&com.itxxz& use-default-filters=&false&&
&context:include-filter type=&annotation& expression=&org.springframework.stereotype.Service& /&
&context:include-filter type=&annotation& expression=&org.springframework.stereotype.Repository& /&
&context:include-filter type=&annotation& expression=&org.ponent& /&
&/context:component-scan&
& & & &&1、首先我们要指定包路径(base-package=&com.itxxz&&),也就是项目中的dao、service、controller(或action)所在的目录。
& & & &其实在螃蟹写的实例分层中,只有这三个,dao是接口(interface),没有定义实现类(后续会说明原因)。service是用来处理业务逻辑的,而controller层只作为视图的控制转发。
& & & &2、开启注解,也就是以上配置中的Service、Repository、Component三个声明。下面我们通过代码详细说明:
& & & &service层
& & & &Controller层
& & &&至此spring的配置就告一段落了,下篇我们开始讲解《spring如何整合mybatis》,力求通过最简单的配置,达到最健全的实现。
& & &&想必也开始有不少蠢蠢欲动的心已经按捺不住了。根据以上配置好后,一运行为什么报错了?!
& & & &这里螃蟹先提醒几点,下篇我们继续分析:
& & &&&A. 项目中的xml文件是否根据实例中的进行配置并且确保已经加载
& & &&B. 是否在每一层上都加了注解,并检查下不要把dao层的repository写出resource
& & &&C. java代码中的dao、service、controller三层没有进行继承其它类或实现其它接口,尤其是关于sql方面的
& & &&D. 检查applicationContext.xml中配置的sqlSessionFactory是否配置正确
& & & &有关本实例的源码可以到 《》 下载,任何问题都可以反馈给我们,我们会尽量抽时间解答。
除非本站特殊说,否则转载请以超链接方式注明出处:IT学习者[
更多相关资讯
一、Tomcat服务器端口的配置 Tomcat 的所有配置都放在 conf 文件夹之中,里.....
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
解决了me的大问题
Copyright & 2014
All rights reserved.&&
联系方式(QQ): |人气:2892305
访问用户量:3619
笔记经验:3832
总积分:261656
级别:VIP5
搜索本笔记
ta的交流分类
ta的全部笔记
浏览(100066)|(36)
&&交流分类:|笔记分类:
=============广告==============================&
私塾在线独家Spring3开发实战视频活动促销
私塾在线老师出品,品质值得信赖
还有免费课程:
=============广告==============================
一 开发环境
1、动态web工程
2、部分依赖
java代码:
hibernate-release-4.1.0.Final.zip
hibernate-validator-4.2.0.Final.jar
spring-framework-3.1.1.RELEASE-with-docs.zip
proxool-0.9.1.jar
log4j 1.2.16
slf4j -1.6.1
mysql-connector-java-5.1.10.jar
hamcrest 1.3.0RC2
ehcache 2.4.3
3、为了方便学习,暂没有使用maven构建工程
二 工程主要包括内容
1、springMVC + spring3.1.1 + hibernate4.1.0集成
2、通用DAO层 和 Service层
3、二级缓存 Ehcache
4、REST风格的表现层
5、通用分页(两个版本)
5.1、首页 上一页,下一页 尾页 跳转
5.2、上一页 1 2 3 4 5 下一页
6、数据库连接池采用proxool
7、spring集成测试 &&&
8、表现层的 java validator框架验证(采用hibernate-validator-4.2.0实现)
9、视图采用JSP,并进行组件化分离
三 TODO LIST& 将本项目做成脚手架方便以后新项目查询
1、Service层进行AOP缓存(缓存使用Memcached实现)
2、单元测试(把常见的桩测试、伪实现、模拟对象演示一遍 区别集成测试)
3、监控功能
后台查询hibernate二级缓存 hit/miss率功能&&&&&&
& &后台查询当前服务器状态功能(如 线程信息、服务器相关信息)
4、spring RPC功能
5、spring集成 quartz 进行任务调度
6、spring集成 java mail进行邮件发送
7、DAO层将各种常用框架集成进来(方便查询)
8、把工作中经常用的东西 融合进去,作为脚手架,方便以后查询
四 集成重点及常见问题
1、spring-config.xml 配置文件:
1.1、该配置文件只加载除表现层之外的所有bean,因此需要如下配置:
java代码:
&context:component-scan base-package=&cn.javass&&
&context:exclude-filter type=&annotation& expression=&org.springframework.stereotype.Controller&/&
&/context:component-scan&
通过exclude-filter 把所有 @Controller注解的表现层控制器组件排除
1.2、国际化消息文件配置
java代码:
&!-- 国际化的消息资源文件 --&
&bean id=&messageSource& class=&org.springframework.context.support.ReloadableResourceBundleMessageSource&&
&property name=&basenames&&
&!-- 在web环境中一定要定位到classpath 否则默认到当前web应用下找
&value&classpath:messages&/value&
&/property&
&property name=&defaultEncoding& value=&UTF-8&/&
&property name=&cacheSeconds& value=&60&/&
此处basenames内一定是 classpath:messages ,如果你写出“messages”,将会到你的web应用的根下找 即你的messages.properties一定在 web应用/messages.propertis。
1.3、hibernate的sessionFactory配置 需要使用org.springframework.orm.hibernate4.LocalSessionFactoryBean,其他都是类似的,具体看源代码。
1.4、&aop:aspectj-autoproxy expose-proxy=&true&/& 实现@AspectJ注解的,默认使用AnnotationAwareAspectJAutoProxyCreator进行AOP代理,它是BeanPostProcessor的子类,在容器启动时Bean初始化开始和结束时调用进行AOP代理的创建,因此只对当容器启动时有效,使用时注意此处。
1.5、声明式容器管理事务
建议使用声明式容器管理事务,而不建议使用注解容器管理事务(虽然简单),但太分布式了,采用声明式容器管理事务一般只对service层进行处理。
java代码:
&tx:advice id=&txAdvice& transaction-manager=&txManager&&
&tx:attributes&
&tx:method name=&save*& propagation=&REQUIRED& /&
&tx:method name=&add*& propagation=&REQUIRED& /&
&tx:method name=&create*& propagation=&REQUIRED& /&
&tx:method name=&insert*& propagation=&REQUIRED& /&
&tx:method name=&update*& propagation=&REQUIRED& /&
&tx:method name=&merge*& propagation=&REQUIRED& /&
&tx:method name=&del*& propagation=&REQUIRED& /&
&tx:method name=&remove*& propagation=&REQUIRED& /&
&tx:method name=&put*& propagation=&REQUIRED& /&
&tx:method name=&use*& propagation=&REQUIRED&/&
&!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到--&
&tx:method name=&get*& propagation=&REQUIRED& read-only=&true& /&
&tx:method name=&count*& propagation=&REQUIRED& read-only=&true& /&
&tx:method name=&find*& propagation=&REQUIRED& read-only=&true& /&
&tx:method name=&list*& propagation=&REQUIRED& read-only=&true& /&
&tx:method name=&*& read-only=&true& /&
&/tx:attributes&
&/tx:advice&
&aop:config expose-proxy=&true&&
&!-- 只对业务逻辑层实施事务 --&
&aop:pointcut id=&txPointcut& expression=&execution(* cn.javass..service..*.*(..))& /&
&aop:advisor advice-ref=&txAdvice& pointcut-ref=&txPointcut&/&
&/aop:config&
此处一定注意 使用 hibernate4,在不使用OpenSessionInView模式时,在使用getCurrentSession()时会有如下问题:
当有一个方法list 传播行为为Supports,当在另一个方法getPage()(无事务)调用list方法时会抛出org.hibernate.HibernateException: No Session found for current thread 异常。
这是因为getCurrentSession()在没有session的情况下不会自动创建一个,不知道这是不是Spring3.1实现的bug,欢迎大家讨论下。
因此最好的解决方案是使用REQUIRED的传播行为。
二、spring-servlet.xml:
2.1、表现层配置文件,只应加装表现层Bean,否则可能引起问题。
java代码:
&!-- 开启controller注解支持 --&
&!-- 注:如果base-package=cn.javass 则注解事务不起作用--&
&context:component-scan base-package=&cn.javass.demo.web.controller&&
&context:include-filter type=&annotation& expression=&org.springframework.stereotype.Controller&/&
&/context:component-scan&
此处只应该加载表现层组件,如果此处还加载dao层或service层的bean会将之前容器加载的替换掉,而且此处不会进行AOP织入,所以会造成AOP失效问题(如事务不起作用),再回头看我们的1.4讨论的。
2.2、&mvc:view-controller path=&/& view-name=&forward:/index&/& 表示当访问主页时自动转发到index控制器。
2.3、静态资源映射
java代码:
&!-- 当在web.xml 中
DispatcherServlet使用
&url-pattern&/&/url-pattern& 映射时,能映射静态资源 --&
&mvc:default-servlet-handler/&
&!-- 静态资源映射 --&
&mvc:resources mapping=&/images/**& location=&/WEB-INF/images/& /&
&mvc:resources mapping=&/css/**& location=&/WEB-INF/css/& /&
&mvc:resources mapping=&/js/**& location=&/WEB-INF/js/& /&
以上是配置文件部分,接下来来看具体代码。
三、通用DAO层Hibernate4实现
为了减少各模块实现的代码量,实际工作时都会有通用DAO层实现,以下是部分核心代码:
java代码:
public abstract class BaseHibernateDao&M extends java.io.Serializable, PK extends java.io.Serializable& implements IBaseDao&M, PK& {
protected static final Logger LOGGER = LoggerFactory.getLogger(BaseHibernateDao.class);
private final Class&M& entityC
private final String HQL_LIST_ALL;
private final String HQL_COUNT_ALL;
private final String HQL_OPTIMIZE_PRE_LIST_ALL;
private final String HQL_OPTIMIZE_NEXT_LIST_ALL;
private String pkName =
@SuppressWarnings(&unchecked&)
public BaseHibernateDao() {
this.entityClass = (Class&M&) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Field[] fields = this.entityClass.getDeclaredFields();
for(Field f : fields) {
if(f.isAnnotationPresent(Id.class)) {
this.pkName = f.getName();
Assert.notNull(pkName);
//TODO @Entity name not null
HQL_LIST_ALL = &from & + this.entityClass.getSimpleName() + & order by & + pkName + & desc&;
HQL_OPTIMIZE_PRE_LIST_ALL = &from & + this.entityClass.getSimpleName() + & where & + pkName + & & ? order by & + pkName + & asc&;
HQL_OPTIMIZE_NEXT_LIST_ALL = &from & + this.entityClass.getSimpleName() + & where & + pkName + & & ? order by & + pkName + & desc&;
HQL_COUNT_ALL = & select count(*) from & + this.entityClass.getSimpleName();
@Autowired
@Qualifier(&sessionFactory&)
private SessionFactory sessionF
public Session getSession() {
//事务必须是开启的,否则获取不到
return sessionFactory.getCurrentSession();
Spring3.1集成Hibernate4不再需要HibernateDaoSupport和HibernateTemplate了,直接使用原生API即可。
四、通用Service层代码 此处省略,看源代码,有了通用代码后CURD就不用再写了。
java代码:
@Service(&UserService&)
public class UserServiceImpl extends BaseService&UserModel, Integer& implements UserService {
private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);
private UserDao userD
@Autowired
@Qualifier(&UserDao&)
public void setBaseDao(IBaseDao&UserModel, Integer& userDao) {
this.baseDao = userD
this.userDao = (UserDao) userD
public Page&UserModel& query(int pn, int pageSize, UserQueryModel command) {
return PageUtil.getPage(userDao.countQuery(command) ,pn, userDao.query(pn, pageSize, command), pageSize);
五、表现层 Controller实现
采用SpringMVC支持的REST风格实现,具体看代码,此处我们使用了java Validator框架 来进行 表现层数据验证
在Model实现上加验证注解
java代码:
@Pattern(regexp = &[A-Za-z0-9]{5,20}&, message = &{username.illegal}&) //java validator验证(用户名字母数字组成,长度为5-10)
@NotEmpty(message = &{email.illegal}&)
@Email(message = &{email.illegal}&) //错误消息会自动到MessageSource中查找
@Pattern(regexp = &[A-Za-z0-9]{5,20}&, message = &{password.illegal}&)
@DateFormat( message=&{register.date.error}&)//自定义的验证器
private Date registerD
在Controller中相应方法的需要验证的参数上加@Valid即可
java代码:
@RequestMapping(value = &/user/add&, method = {RequestMethod.POST})
public String add(Model model, @ModelAttribute(&command&) @Valid UserModel command, BindingResult result)
六、Spring集成测试
使用Spring集成测试能很方便的进行Bean的测试,而且使用@TransactionConfiguration(transactionManager = &txManager&, defaultRollback = true)能自动回滚事务,清理测试前后状态。
java代码:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {&classpath:spring-config.xml&})
@Transactional
@TransactionConfiguration(transactionManager = &txManager&, defaultRollback = true)
public class UserServiceTest {
AtomicInteger counter = new AtomicInteger();
@Autowired
private UserService userS
其他部分请直接看源码,欢迎大家讨论。
补充spring3.1.1源代码分析当 传播行为为 Support时报&org.hibernate.HibernateException: No Session found for current thread 异常:
spring3.1开始 不提供(没有这个东西了)Hibernate4的 DaoSupport和Template,,而是直接使用原生的Hibernate4 API&
如在 Hibernate3中 HibernateTemplate中有如下代码&
protected&Session&getSession()&{&&
&&&&&&&&if&(isAlwaysUseNewSession())&{&&
&&&&&&&&&&&&return&SessionFactoryUtils.getNewSession(getSessionFactory(),&getEntityInterceptor());&&
&&&&&&&&}&&
&&&&&&&&else&if&(isAllowCreate())&{&&
&&&&&&&&&&&&return&SessionFactoryUtils.getSession(&&
&&&&&&&&&&&&&&&&&&&&getSessionFactory(),&getEntityInterceptor(),&getJdbcExceptionTranslator());&&
&&&&&&&&}&&
&&&&&&&&else&if&(SessionFactoryUtils.hasTransactionalSession(getSessionFactory()))&{&&
&&&&&&&&&&&&return&SessionFactoryUtils.getSession(getSessionFactory(),&false);&&
&&&&&&&&}&&
&&&&&&&&else&{&&
&&&&&&&&&&&&try&{&&
&&&&&&&&&&&&&&&&return&getSessionFactory().getCurrentSession();&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&catch&(HibernateException&ex)&{&&
&&&&&&&&&&&&&&&&throw&new&DataAccessResourceFailureException(&Could&not&obtain&current&Hibernate&Session&,&ex);&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
但我们使用的是Hibernate4原生API,使用SpringSessionContext获取session,而这个isAllowCreate选项默认为false&
public&Session&currentSession()&throws&HibernateException&{&&
&&&&try&{&&
&&&&&&&&return&(org.hibernate.classic.Session)&SessionFactoryUtils.doGetSession(this.sessionFactory,&false);&&
&&&&catch&(IllegalStateException&ex)&{&&
&&&&&&&&throw&new&HibernateException(ex.getMessage());&&
SessionFactoryUtils类&
public&static&Session&doGetSession(SessionFactory&sessionFactory,&boolean&allowCreate)&&
&&&&&&&&throws&HibernateException,&IllegalStateException&{&&
&&&&return&doGetSession(sessionFactory,&null,&null,&allowCreate);&&
可否认为这是集成Hibernate4的bug,或者采用OpenSessionInView模式解决或使用Required传播行为。
原创内容,转载请注明私塾在线【】
相关笔记推荐
精品视频课程推荐
JUnit4的基本使用;在maven环境下使用JUnit;用JMock来模拟测试对象要依赖的对象;用cobertura实现覆盖测试;用hundson实现持续集成;JUnit3的基本使用。
WebLogic基础知识:WebLogic基本概念、正确安装WebLogic、建域、应用部署于JDBC选择、对WebLogic的监控和日志查看、集群的高可用性;课程目标:彻底掌握WebLogic的基本概念,在理解基本概念的基础上做到正确的安装WebLogic,根据不同的需求创建域,合理选择应用部署和JDBC配置。熟练掌握WebLogic的console监控,了解各种性能和运行指标,以及对监控结果的分析,运用集群的高可用性,对集群架设。
本视频课程是北京Java私塾原创精品书籍《研磨设计模式》一书的配套学习视频,由《研磨设计模式》的第一作者CC录制
课程目标:全面、系统的掌握GoF设计模式的知识,达到可以在实际项目开发中运用的能力
技术要点:如何实现可配置、如何实现缓存以及缓存的管理、如何实现用缓存来控制多实例的创建、如何实现参数化工厂、 如何实现可扩展工厂、如何实现原型管理器、如何实现Java的静态代理和动态代理、如何实现多线程处理队列请求、 如何实现命令的参数化配置、可撤销的操作、宏命令、队列请求和日志请求、如何实现翻页迭代、如何检测环状结构、 如何实现通用的增删改查、如何模拟工作流来处理流程、如何实现简单又通用的XML读取、如何实现模拟AOP的功能......
本课程专注于数据结构和算法的内容,使用Java来进行代码示例,不空洞的讲解概念和理论,重点放在代码的实现和示例上。
从零开始、全面系统、成体系的讲解数据结构和基本算法,循序渐进的讲述构建软件系统所常见的数据结构和算法。
系统、完整的学习Spring Web MVC开发的知识。包括:Spring Web MVC入门;理解DispatcherServlet;注解式控制器开发详解;数据类型转换;数据格式化;数据验证; 拦截器;对Ajax的支持;文件上传下载;表单标签等内容;最后以一个综合的CRUD带翻页的应用示例来综合所学的知识
浏览(100066)|(36)
&&交流分类:|笔记分类:
非常好,感谢无私的分享,解决了大问题了
张老师好:
我有一个问题我不太清楚,有很多类都没有用到:ICommonDao,ICommonDao,ICommonService,CommonService,CommonHibernateDao。这些类在项目中有什么作用呢?
&同问,请张老师抽空解答一下。
张老师你好,sessionFactory 注入失败怎么解决的啊?找了好些资料hibernate4都有这个问题,下了你的例子也是报这个错误的。请指教指教,谢谢!
错误信息:Error creating bean with name 'CommonHibernateDao': Injection of autowired nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory mon.monHibernateDao.sessionF nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [spring-config.xml]: Invocation o nested exception is java.lang.NullPointerException
下载下来看看
开涛老师 , 提供一个访问这个项目的地址吧?
我初学还没几天,想学习学习您写的东西.
不错,学习中
The method list(String, Object[]) is ambiguous for the type BaseHibernateDao&M,PK&
LINE & &126 &132 135 &142 144 &报错 &请老师解答
The method list(String, Object[]) is ambiguous for the type BaseHibernateDao&M,PK&
编译报错 & 用的是JDK7 64位的 & 请老师指点&
在朋友的86的系统上 一切正常 &求解
张老师好:
我有一个问题我不太清楚,有很多类都没有用到:ICommonDao,ICommonDao,ICommonService,CommonService,CommonHibernateDao。这些类在项目中有什么作用呢?
张老师好:
我有一个问题我不太清楚,有很多类都没有用到:ICommonDao,ICommonDao,ICommonService,CommonService,CommonHibernateDao。这些类在项目中有什么作用呢?
proxool.maximum.connection.count 有问题 检查下
张老师,请问一下。我把你提供的源码中数据库密码改了,但启动tomcat报错,不知道还需要修改哪些地方
13:23:14 [main] ERROR org.springframework.web.context.ContextLoader - Context initialization failedorg.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in class path resource [spring-config.xml]: Could not resolve placeholder 'proxool.maximum.connection.count'&at org.springframework.beans.factory.config.PlaceholderConfigurerSupport.doProcessProperties(PlaceholderConfigurerSupport.java:209)&at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:220)&at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:84)&at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681)&at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:656)&at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:446)&at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)&at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)&at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)&at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)&at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)&at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)&at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)&at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)&at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)&at org.apache.catalina.core.StandardService.start(StandardService.java:516)&at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)&at org.apa
BaseHibernateDao 文件报错,list方法缺少参数?
The method list(String, Object[]) is ambiguous for the type BaseHibernateDao&M,PK&
写的非常好
版权所有 Copyright(C) 私塾在线学习网<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&

我要回帖

更多关于 基于注解的spring mvc 的文章

 

随机推荐