MAVEN+SPRING+MYBATIS整合常见问题

  •       最近在研究J2EE开发,中间碰到不少问题,于是写下此文,用于记录这个过程,并为其他与我一样在路上的朋友提供参考,随着时间的推移,此文将不断补充完善
  • 通过Server视图启动TOMCAT提示错误:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1358)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3770)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4334)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
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.apache.catalina.startup.Catalina.start(Catalina.java:566)

造成问题的原因至今不明确,我是用STS进行开发,原想将项目拆成多个MAVEN项目,总有点问题后暂时放弃又合起来了,之后就一直这样,什么CLEAN啊之类的操作都试过,一直没有解决。

从这错误的现象来看是因为找不到org.springframework.web.context.ContextLoaderListener这个类,这个类在WEB.XML配置引用。

碰到这个问题我首先想是不是因为中间折腾过几次项目,造成了编译的问题,于是执行MAVEN CLEAN,然后MAVEN INSTALL,再把SERVER删除重新来,但是问题依旧。于是我又新建一个全新项目发布到TOMCAT,一切正常,操作时发现有一个特点,如下图:

 

图1

图中myproject是我出问题的项目,mytest1是我新建的测试项目,新建的项目在添加发布时多一个spring-web的JAR包依赖,于是我打开两个项止的.classpath,发现出问题的项目少了一句话

正常的项目如下

<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
  <attributes>
   <attribute name="maven.pomderived" value="true"/>
   <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
  </attributes>
 </classpathentry>

问题项目如下

<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
  <attributes>
   <attribute name="maven.pomderived" value="true"/>
  </attributes>
 </classpathentry>

于是把<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>给加上,进入开STS刷新,然后再进入到图1界面,这下myproject也有了spring-web引用了。

按正常的发布流程发布,一切正常。

 

 

  • Caused by: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [spring-mybatis.xml]: Invocation of init method failed; nested exception is java.sql.SQLException: oracle.jdbc.driver.OracleDriver
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1486)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
 at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:323)
 ... 53 more
Caused by: java.sql.SQLException: oracle.jdbc.driver.OracleDriver
 at com.alibaba.druid.util.JdbcUtils.createDriver(JdbcUtils.java:500)
 at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:382)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:601)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1612)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1553)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1483)
 ... 60 more
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
 at com.alibaba.druid.util.JdbcUtils.createDriver(JdbcUtils.java:494)
 ... 68 more

 

笔者在做一个MAVEN+SPRING+MYBATIS+ORACLE整合时碰到这个问题,单元测试SERVICE一切正常,但是发布到TOMCAT7时出现这个错误。

从这个错误的现象来看是ORACLE驱动的OJDBC没有一起发布,我原来在POM.XML文件是这么写的

<dependency>
   <groupId>com.oracle</groupId>
   <artifactId>ojdbc6</artifactId>
   <version>11</version>
    <scope>system</scope>
   <systemPath>${project.basedir}/lib/ojdbc6.jar</systemPath> 
  </dependency>

其实这个问题非常明显,原因就是通过这样SYSTEMPATH方式引用造成的,其实MAVEN可以引用本地JAR包,但需要自己去单独发布,为了省事,你也可以将JAR包导入到本地库中,方法是在MAVEN的BIN目录下用命令行执行如下语句

mvn install:install-file -Dfile=E:\J2EE\jar\ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11 -Dpackaging=jar

具体的参数内容根据自己的情况修改,执行完之后再将POM.xml中的配置改成如下内容

<dependency>
   <groupId>com.oracle</groupId>
   <artifactId>ojdbc6</artifactId>
   <version>11</version>
  </dependency>

至此问题解决。


  • Invalid classpath publish/export dependency org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7. The associated classpath container cannot be included in the published/exported module.portal-webP/portal-webClasspath Dependency Validator Message

这个问题的出现是因今天在建立MAVEN多模块项目,中间用过一次MAVEN -->Update projects ...的操作,然后就出现。

 出现这个错误后如果仍然发布,启动TOMCAT也将如下错误

java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

仔细一看跟本文的第一个问题的症状非常相似,参照第一个问题的方式未能解决。随后我拿着一个正常的MAVEN项目打开项目属性界面,发现出问题的项目有一处配置不对,通过修改改成正常项目一样问题解决,具体的修改步骤如下:


在项目中点右键,再选择Properties


选择如上图的选项,再点击ADD按钮


选择Java Build Path Entries


选择唯一的MAVEN选项,完成


完成后的结果如上图,其中我这有一个portal-core的MAVEN MODULE依赖,这个你不会有的,依照上面的步骤处理完毕问题解决。

 

 

  • Javascript检测错误

 当项目引入JQuery-x.x.x.min.js后Markers窗口总是提示一语法错误之类的东西,虽然不影响整个开发,但是看久了也烦。对于这种东西你是没办法修正的,要处理只能把Javascript的检测功能给关掉,关闭方法如下:

项目上右键 - Properties - Builders -JavaScript Validator去掉勾即可解决

 

  • Removing obsolete files from server...
    Could not clean server of obsolete files: null
    java.lang.NullPointerException

 

 


SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
[INFO] Scanning for projects...
[ERROR] The build could not read 2 projects -> [Help 1]
[ERROR]  
[ERROR]   The project net.ntrue:portal-web:2.0.0 (E:\ntrue\platform\portal\portal-web\pom.xml) has 1 error
[ERROR]     Non-parseable POM C:\Users\Administrator\.m2\repository\net\ntrue\portal\2.0.0\portal-2.0.0.pom: Expected root element 'project' but found 'html' (position: START_TAG seen \n<html>... @2:7)  @ C:\Users\Administrator\.m2\repository\net\ntrue\portal\2.0.0\portal-2.0.0.pom, line 2, column 7 -> [Help 2]
[ERROR]  
[ERROR]   The project net.ntrue:portal-core:2.0.0 (E:\ntrue\platform\portal\portal-core\pom.xml) has 1 error
[ERROR]     Non-parseable POM C:\Users\Administrator\.m2\repository\net\ntrue\portal\2.0.0\portal-2.0.0.pom: Expected root element 'project' but found 'html' (position: START_TAG seen \n<html>... @2:7)  @ C:\Users\Administrator\.m2\repository\net\ntrue\portal\2.0.0\portal-2.0.0.pom, line 2, column 7 -> [Help 2]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/ModelParseException

 

这是在编写完代码准备启动TOMCAT调试时出现的错误,具体原因可能是因为我手工修改过TOMCAT下的配置文件,找了好久但没有明确到底是哪个项修改造成的,后通过删除TOMCAT目录,然后重新添加SERVER解决问题。

 

 

  • 运行maven test时提示Failed tests:   myproject.TestXXXController.testList(): org/junit/Assert

打开项目TARGET目录下的XML报告发现错误原因如下

java.lang.NoClassDefFoundError: org/junit/Assert
 at net.ntrue.framework.test.JControllerBase.executeAction(JControllerBase.java:97)
 at net.ntrue.portal.controller.TestBrandController.testList(TestBrandController.java:13)
Caused by: java.lang.ClassNotFoundException: org.junit.Assert
 at java.net.URLClassLoader$1.run(Unknown Source)
 at java.net.URLClassLoader$1.run(Unknown Source)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 ... 20 more

要说清这个问题得从MAVEN多项目的结构开始,我的项目结果是这样的

|-Framework 公共类库,独立的maven 项目,有两个用于测试用的抽象基类

|-portal

     |-portal-parent  一个MAVEN的PARENT项目,本身没有程序逻辑,只负责公共的POM依赖定义,junit的依赖声明也在这里

     |-portal-web   纯WEB的JSP页面

     |-portal-core   WEB类除JSP之外的都在这里,内部几乎所有的类都有单元测试,包括SERVICE和CONTROLLER

 

在portal-core运行maven test时几乎所有的测试用例均错误,后猜测可能的原因是因为加入了framework的引用,而framework里将junit声明为test

后将junit的声明由portal-parent中移到portal-core项目的POM.XML中问题解决,具体原因暂没了解透

修改后的portal-core项目POM.XML内容如下

<dependencies>
  

  <dependency>
   <groupId>net.ntrue</groupId>
   <artifactId>framework</artifactId>
   <version>1.0.0</version>
  </dependency>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.11</version>
   <scope>test</scope>
  </dependency>
 </dependencies>

 

  • Spring MVC JSON请求异常

        异常的内容有两段,当使用了@RequestBody时提示如下错误

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
 at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.readWithMessageConverters(HandlerMethodInvoker.java:645)
 at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestBody(HandlerMethodInvoker.java:605)
 at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:354)
 at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
 at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:439)
 at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:427)
 at net.ntrue.framework.test.JControllerBase.excuteAction(JControllerBase.java:74)
 at net.ntrue.portal.webservice.TestService.TestJsonWrite(TestService.java:63)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
 at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
 at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
 at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
 at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
 at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
 at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

         使用@ResponseBody时反馈以下错误

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
 at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.writeWithMessageConverters(AnnotationMethodHandlerAdapter.java:1054)
 at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.handleResponseBody(AnnotationMethodHandlerAdapter.java:994)
 at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.getModelAndView(AnnotationMethodHandlerAdapter.java:943)
 at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
 at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:427)
 at net.ntrue.framework.test.JControllerBase.excuteAction(JControllerBase.java:74)
 at net.ntrue.portal.webservice.TestService.TestJsonWrite(TestService.java:63)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
 at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
 at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
 at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
 at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
 at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
 at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

 

从这两段错误可以很明显看出是不知道该用哪个CONVERT类去处理请求和响应的数据,之前认真研究过SPRING MVC,其实SPRING MVC处理这种JSON格式的传参和返回是非常简单的,按照书上和网上的方法尝试几次仍未解决,偶然发现是因为SPRING MVC的配置文件上对于org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter这个BEAN的描述重复了,其中一个未添加MappingJacksonHttpMessageConverter的引用

错误时的XML配置如下

<bean id="mappingJacksonHttpMessageConverter"
  class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
  <property name="supportedMediaTypes">
   <list>
    <value>application/json; charset=UTF-8</value>
    <value>text/html;charset=UTF-8</value>
   </list>
  </property>
 </bean>
 <bean id="AnnotationMethodHandlerAdapter"
  class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
 </bean>

 <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
 <bean
  class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  <property name="messageConverters">
   <list>
    <ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 -->
   </list>
  </property>
 </bean>

去掉中间的

 <bean id="AnnotationMethodHandlerAdapter"
  class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
 </bean>

之后一切正常

 

 

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值