您的位置:首页 > 编程语言 > Java开发

MAVEN+SPRING+MYBATIS整合常见问题

2014-02-20 15:25 405 查看
      最近在研究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,一切正常,操作时发现有一个特点,如下图:



[align=left] [/align]

图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>

之后一切正常

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java SPRING MAVEN