在这个文档中只会有错误或者是解答
一、Web程序加载时错误
1.1、java.lang.reflect.InvocationTargetException
=====在web.xml中的web-app中加入: metadata-complete="true" 网页上的解释: web.xml文件中使用<metadata-complete>元素通知Web容器是否要寻找注解,如果你将<metadata-complete>设为false,或者在文件中不指定<metadata-complete>元素,那么在部署期间,容器必须扫描注解和Web分片,为Web应用程序构建有效的元数据。如果将<metadata-complete>设为true,将由部署描述符为Web应用程序提供所有的配置信息 自我理解: 这个属性是用来判断在部署项目时是否扫描注解,web 分片;外附网址: |
1.2 Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory';nested exception is org.springframework.beans.factory.BeanCreationException:
调试 了一下发现是mybatis.xml中的配置文件出错了。没有加mybatis 的dtd |
1.3 org.apache.jasper.JasperException: Unable to compile class for JSP:
我原本项目的jre1.8 的版本,但是tomcat是 7.0 的版本,后来看了网上的教程说,出现这样的错误可能是版本号不一样,所以我将tomcat 服务器的版本换成了8.0的,清理后再用 Tomcat8.0 开启项目进网页果然不报错了。 |
1.4java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener
开启服务器报错:应该是缺少了上面的一个包,后来可以了,清理与开启 |
|
1.5 在springmvc web中找不到静态的资源
原来在springmvc中 会自动拦截所有的请求,所以你需要单独配置这些静态的请求,springmvc才会去放过它。 <mvc:annotation-driven></mvc:annotation-driven> <mvc:resources location="/images/" mapping="/images/**" cache-period="31556926"/> <mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/> <mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/> <mvc:resources location="/html/" mapping="/**"/> |
|
1.6 加载jsp页面找不到路径:description The requested resource is not available.
找到的问题:原来是有一个Controller 中配置的Dao接口没有在springBean中配置,可能就到至那个控制器出错了,然后就会提示请求错误。 |
1.7
java.lang.IllegalArgumentException: Parameter Maps collection does not contain value for com.hu.Dao.CardDao.card
应该是mybatis映射的mapper.xml 中的参数类型不正确。--已解决 |
1.8 com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException
|
1.9
java.lang.NoClassDefFoundError: Lcom/hu/Dao/NewsDao;
加载错误,清理后再开没问题了。 |
2.0 java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener
据我了解,是某个包没有加载出来,或者缺少某个包
2.1 Caused by: java.lang.ClassNotFoundException: org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
还没完,我把HTML页面中有js的代码去了,css中可能后json 中代码去了,就不报classnotfoundException 这个错误了,但是有新的错误出现了,下面我们来看一下: |
2.2 bean注入失败
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'capsuleController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.ll.server.CapsuleServer com.ll.mvc.CapsuleController.cs; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter] for bean with name 'mappingJacksonHttpMessageConverter' defined in class path resource [config/spring-mvc.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
据我看,出现这样的情况大概就是,spring-mvc.xml,spring-mybatis.xml中的配置问题 <!-- 避免IE执行ajax 时,返回JSoN出现下载文件 --> <!-- spring 4.1.0 中是使用的这个类,spring3.0会是不同的包 org.springframework.http.converter.json.MappingJacksonHttpMessageConverter --> |
2.3
java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext 好像是spring中的applicationContext.xml 没有找到,在web.xml中没有配置到, <context-param> <param-name>contextConfigLocation</param-name> <param-value>/config/spring-mybatis.xml,classpath*:spring-mvc.xml</param-value> </context-param> 这个值没有写好,你信吗,希望以后的我会知道。,然后报了下面的这个错误。 然后我知道了, <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/spring-*.xml</param-value> </context-param> 这么写才是正确的,但是下面又报错了。 |
2.4 org.springframework.beans.factory.BeanDefinitionStoreException IOException
parsing XML document from ServletContext resource [/config/spring-mybatis.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/config/spring-mybatis.xml]
|
2.5 E:\WorkSpace\java001\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\SPRINGMVCTEST\WEB-INF\classes\config\spring-config.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 39; 文件提前结束。
这个xml中没有写dtd |
2.6
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'capsuleController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.ll.server.CapsuleServer com.ll.mvc.CapsuleController.cs; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'capsulserverimpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.ll.dao.ICapsule com.ll.server.impl.CapsuleServerImpl.capsuledao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.ll.dao.ICapsule] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
|
2.7 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'capsuleServer' is defined
下面这个故事,是引用某个大神的博客的内容,我觉得很有用就复制了,谢谢 有个工程师,在项目工程里加了些页面和Service,Dao之类,然后启动web工程,Spring一直报错说找不到autowired定义的service接口的实现bean的定义,然后来求助我来帮忙解决。 我理所当然的按照常规步骤1,2,3...检查他的代码是否存在问题:
第一步,检查service接口是否确实有实现类并且@Service标注了,这个是初学者让出现问题,检查结果确实没问题Pass。
第二布,因为其service定义在新的package里,遂检查其spring配置里,component-scan是否新增加了扫描package,检查结果确实没问题Pass。
第三步,怀疑Eclipse开发环境里,运行tomcat的时候,没有publish成功,确认workspace里是自动build,并且clean & Rebuild,在clean tomcat server,问题依旧。
第四步,还是怀疑Eclipse开发环境里,运行tomcat的时候,没有publish成功,遂检查workspace的的.metadata/.plugins/org.eclipse.wst.server.core里所发布的内容,检查结果确实class已经publish过去没问题,Pass。
第五步,检查Web工程里的Deployment Assembly,配置正确没问题,Pass。
逐步检查下来,常规的错误貌似都没有犯,但怎么clean,再启动依然报错,找到Service接口,Ctrl+T,确实找到实现类,并且@Service标注。问题查到这里就有点奇怪了,这样问题以前貌似没碰到过。 有问题不能不解决,继续琢磨,Ctrl+G找Service所有引用,发现有两个地方被使用@Autowared注入,然后,然后,然后,点其中一个引用的地方,Ctrl+T找其实现类,很神奇的发现,光标就跳到引用这个service的类本身上。OMG,Finally,原来该Service的实现Bean在引用自身Service,结果循环引用导致无法实例化Bean而报出这个错误。对于一个中高级工程师来说,犯这个错误,我只能一顿痛扁,挣一顿免费晚餐,你,是否也曾经犯过这个傻呢...... 后来还是错了,最后只能将这个controller 的注入给注释掉了,注释完后,又报错:在spring-mybatis.xml 的配置中创建bean sqlSessionFactory错误,没有mapperLations这个属性,我真的是日了,报了两天没有解决的错误,竟然是这个:下面才是正确的,写在下面用来警示自己。 <property name="mapperLocations" value="classpath:com/ll/mapping/*.xml"></property> 这个错误告诉我一个道理,做人不能太自大,耽误两天时间又让我少活两天。 |
开了服务器没有报错了,终于可以开始写项目了。苍天抱我不要出错呀。
2.8java.lang.NoClassDefFoundError:org/apache/commons/pool/impl/GenericObjectPool
据说是没有在项目中加入包 commons-pool-1.3.jar |
2.9 java.sql.SQLException: No suitable driver
Jdbc.properties 配置文件,的URL 写错了,正确的为: username=root pwd=sa123 url=jdbc:mysql://127.0.0.1:3306/pro??useUnicode=true&characterEncoding=utf8 driver=com.mysql.jdbc.Driver
|
3.0:
### Error updating database. Cause: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:
没啥问题,重开就好了。 |
3.1:对于springmvc中的静态资源的配置,解释如下
<mvc:default-servlet-handler/> <mvc:annotation-driven/> 上面的这两种配置方式只是在DispatcherServlet的请求处理路径为“/”的情况下使用,如果你配置的是*.do或*.pay等方式则不需要上面这样的配置,因为*.do或*.pay只处理以它结尾的请求,对静态资源文件不会做任何处理。
①. 当两种标签都没有的时候,框架默认注册的有AnnotationMethodHandlerAdapter这个bean,所以能够处理@RequestMapping这个注解。 ②. 但是只配置了<mvc:default-servlet-handler/>时所注册的两个bean都不能处理@RequestMapping注解,因此无法找到相应的Controller,进而无法进行访问路径的映射, ③. 当两种标签都有的时候,<mvc:annotation-driven/>会注册一个RequestMappingHandlerAdapter的bean,这个bean能够处理@RequestMapping这个注解。 静态文件的路径就是这个默认的文件夹的路径。 |
我的程序可以运行了,可以返回json数据了,下面就来看一看我写的代码吧。
1.1控制器代码:
package com.ll.mvc;
import java.io.IOException; import java.io.PrintWriter; import java.util.List;
import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse;
import org.json.JSONArray; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping;
import com.alibaba.fastjson.JSONObject; import com.ll.server.CapsuleServer; import com.ll.vo.Capsule;
@Controller public class CapsuleController { @Resource(name="capsuleService",shareable=true) CapsuleServer cs; @RequestMapping("/add") public String add(@ModelAttribute Capsule capsule , Model model){ System.out.println(capsule.toString()); if(capsule!=null&&capsule.getExplains()!=null&&capsule.getTypeId()!=null&&capsule.getType()!=null){ if(cs.add(capsule)){ model.addAttribute("capsule",capsule); } return "index"; } return "../../index"; } @RequestMapping("/select") public void select(@ModelAttribute String id,HttpServletResponse response){ response.setContentType("json/html;charset=utf-8"); PrintWriter out ; try { out = response.getWriter(); List<Capsule> l = cs.select(); JSONObject jo = new JSONObject(); jo.put("l", l); out.print(jo.toString()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
|
1.2 前端代码:核心代码
<a href="javascript:οnclick=tj()">提交</a> <script type="text/javascript"> function tj(){ alert("hello"); $.ajax({ url:"select", type:"post", dataType:"json", success:function(msg){ alert("success:"+msg.l); var ar = new Array(); ar = eval(msg.l); alert(ar.length); for(var i = 0 ; i<ar.length;i++ ){ alert(ar[i].id); } }, error:function(msg){ alert("error:"+msg.l); } }) } </script> <div id="ok"></div> |
1.3看一看我配置的xml文件
1.3.1 spring-mybatis.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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <!--自动扫描 --> <context:annotation-config base-package="com.ll"></context:annotation-config> <!-- 引入配置文件--> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations" value="classpath:config/jdbc.properties"></property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- destroy-method=close: 当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用 --> <property name="driverClassName" value="${driver}"></property> <property name="url" value="${url}"></property> <property name="password" value="${pwd}"></property> <property name="username" value="${username}"></property> </bean> <!-- spring 和mybatis完美整合,不需要mybatis的配置映射文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <!-- 自动扫描 mapping.xml文件--> <property name="mapperLocations" value="classpath:com/ll/mapping/*.xml"></property> </bean> <!-- DAO 接口所在的包名,spring会自动查找其下的类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" > <property name="basePackage" value="com.ll.dao"></property> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!-- bean (事务管理) transanction manager ,use --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> </beans> |
1.3.2 看spring-mvc.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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 3.自动扫描该包,使springmvc认可下的@controller注解的类控制器 --> <context:component-scan base-package="com.ll.mvc"></context:component-scan> <!-- 4.使用 mvc:annotation-driven 加载注解映射器和注解适配器配置--> <mvc:annotation-driven></mvc:annotation-driven> <!-- --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>
<!-- 避免IE执行ajax 时,返回JSoN出现下载文件 --> <!-- spring 4.1.0 中是使用的这个类,spring3.0会是不同的包 org.springframework.http.converter.json.MappingJacksonHttpMessageConverter --> <bean id="mappingJacksonHttpMessageConverter" class=" org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- 1.开启SpringMVC注解模式 --> <!-- 简化配置: (1)自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter (2)提供一些列:数据绑定,数字和日期的format @NumberFormat, @DateTimeFormat, xml,json默认读写支持 --> <mvc:annotation-driven/> <!-- 2.静态资源默认servlet配置 (1)加入对静态资源的处理:js,gif,png (2)允许使用"/"做整体映射 --> <mvc:default-servlet-handler/> </beans> |
1.3.3 web.xml 的配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>SPRINGMVCTEST</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/spring-*.xml</param-value> </context-param> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>com.ll.test.TestDispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app> |
1.4最后看一看我项目结构:
就这样发了,还不行,还是将我所有的代码一一的写出来; |
1. Dao接口:
package com.ll.dao;
import java.util.List;
import org.springframework.stereotype.Service;
import com.ll.vo.Capsule;
/** * 胶囊dao接口 * @author LaoLi * */
public interface ICapsule {
public List<Capsule> select(); public boolean add(Capsule capsule); }
|
映射xml文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ll.dao.ICapsule"> <insert id="add" parameterType="com.ll.vo.Capsule"> insert into capsule values(null,#{explains},#{type},#{typeId}); </insert> <select id="select" resultType="com.ll.vo.Capsule"> select * from capsule; </select> </mapper> |
2. 服务层:CapsuleServer.java
package com.ll.server;
import java.util.List;
import org.springframework.stereotype.Service;
import com.ll.vo.Capsule; public interface CapsuleServer {
public List<Capsule> select(); public boolean add(Capsule capsule); }
|
服务层实现类:CapsuleServerImpl.java
package com.ll.server.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
import com.ll.dao.ICapsule; import com.ll.server.CapsuleServer; import com.ll.vo.Capsule; @Service("capsuleService") public class CapsuleServerImpl implements CapsuleServer {
@Resource private ICapsule capsuledao; @Override public List<Capsule> select() { return capsuledao.select(); }
@Override public boolean add(Capsule capsule) { return capsuledao.add(capsule); }
}
|
3. 控制层:CapsuleController.java
上面写过了 |
4. 实体类:Capsule.java
package com.ll.vo; /** * 胶囊。航天舱 * @author LaoLi * */ public class Capsule {
private Integer id; private String type; private String explains; private Integer typeId; @Override public String toString() { return "Capsule [id=" + id + ", type=" + type + ", explains=" + explains + ", typeId=" + typeId + "]"; } public Capsule(Integer id, String type, String explains, Integer typeId) { this.id = id; this.type = type; this.explains = explains; this.typeId = typeId; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getExplains() { return explains; } public void setExplains(String explains) { this.explains = explains; } public Integer getTypeId() { return typeId; } public void setTypeId(Integer typeId) { this.typeId = typeId; } public Capsule(){ } }
|
5. Jdbc.properties
username=root pwd=sa123 url=jdbc:mysql://127.0.0.1:3306/pro??useUnicode=true&characterEncoding=utf8 driver=com.mysql.jdbc.Driver |