用ant打包發佈工程後,進入後臺管理髮現報錯如下:Request processing failed; nested exception is org.springframework.web.bind.annotation.support.HandlerMethodInvocationException
我的build.xml是下面的寫法,記錄一下。
<?xml version="1.0" encoding="UTF-8"?>
<project name="moco" default="publish" basedir=".">
<target name="init" description="設置初始化打 war 包需要的路徑變量">
<property name="name" value="moco" />
<property name="src" value="${basedir}/src" />
<property name="lib" value="${basedir}/WebContent/WEB-INF/lib" />
<property name="webapp" value="${basedir}/WebContent" />
<property name="packages" value="ant.*" />
<property name="build.src" value="${basedir}/release/moco/src" />
<property name="build.dest" value="${basedir}/release/moco/WEB-INF/classes" />
<property name="buildwar.dest" value="${basedir}/release/moco" />
<property name="build.javadocs" value="${basedir}/release/doc" />
<property name="jar.dest" value="${basedir}/release/jar" />
<property name="war.dest" value="${basedir}/release/war" />
<!-- 本地tomcat配置,爲了方便實時打包到本地部署 -->
<property name="tomcat.home" value="/Applications/apache-tomcat-6.0.36/" />
<path id="classpath">
<fileset dir="${lib}">
<include name="**/*.jar" />
</fileset>
<fileset dir="${tomcat.home}/lib">
<include name="*.jar" />
</fileset>
</path>
</target>
<target name="prepare" depends="init" description="創建打包需要的路徑,拷貝源文件到打包路徑下">
<mkdir dir="${build.src}" />
<mkdir dir="${build.dest}" />
<mkdir dir="${buildwar.dest}" />
<mkdir dir="${jar.dest}" />
<mkdir dir="${war.dest}" />
<copy todir="${build.src}">
<fileset dir="${src}" />
</copy>
<copy todir="${buildwar.dest}">
<fileset dir="${webapp}" />
</copy>
</target>
<target name="build" depends="prepare" description="編譯 java 文件,拷貝 properties 屬性配置文件到編譯後的路徑下">
<javac srcdir="${build.src}" destdir="${build.dest}" encoding="utf-8" debug="true">
<classpath refid="classpath" />
</javac>
<copy todir="${build.dest}">
<fileset dir="${build.src}">
<include name="**/*.properties" />
<include name="**/*.xml" />
</fileset>
</copy>
</target>
<!-- depends="javadoc" -->
<target name="antjar" depends="build" description="打 jar 包,不將 java 文件打入包內">
<delete dir="${build.src}" />
<jar jarfile="${jar.dest}/moco_cms.jar" basedir="${build.dest}"/>
</target>
<target name="antwar" depends="build" description="打 war 包,不將 java 文件打入包內">
<delete dir="${build.src}" />
<war warfile="${war.dest}/moco.war" >
<lib dir="${buildwar.dest}/WEB-INF/lib" />
<classes dir="${build.dest}" />
<fileset dir="${buildwar.dest}" />
</war>
</target>
<target name="publish" depends="antjar,antwar,clean" description="發佈 war 包至 tomcat 目錄下">
<copy todir="${tomcat.home}/webapps">
<fileset dir="${war.dest}">
<include name="**/*.war" />
</fileset>
</copy>
</target>
<!--
<target name="javadoc" depends="build" description="生成 java 的 API 幫助文檔">
<mkdir dir="${build.javadocs}"/>
<javadoc packagenames="${packages}" sourcepath="${build.src}" destdir="${build.javadocs}" author="true" version="true" use="true" splitindex="true" windowtitle="${name} API" doctitle="${name}">
<classpath refid="classpath"/>
</javadoc>
</target>
-->
<target name="clean" depends="init" description="清除打包用臨時文件">
<delete dir="${build.src}" />
<delete>
<fileset dir="${build.dest}" includes="**/*.classes" />
</delete>
<delete dir="${buildwar.dest}" />
</target>
</project>
上網查了下,原因是下面的文章描述:
原帖地址:http://tiannet.iteye.com/blog/722838
在使用SpringMVC綁定基本類型(如String,Integer等)參數時,應通過@RequestParam註解指定具體的參數名稱,否則,當源代碼在非debug模式下編譯後,運行時會引發HandlerMethodInvocationException異常,這是因爲只有在debug模式下編譯,其參數名稱才存儲在編譯好的代碼中。
譬如下面的代碼會引發異常:
- @RequestMapping(value = "/security/login", method = RequestMethod.POST)
- public ModelAndView login(@RequestParam String userName, @RequestParam String password,
- HttpServletRequest request) {
- ......................
如果使用Eclipse編譯不會在運行時出現異常,這是因爲Eclipse默認是採用debug模式編譯的,但是如果使用Ant通過javac任務編譯的話就會出現異常,除非指定debug=”true”。
當然,最好的做法是通過@RequestParam註解指定具體的參數名稱,如,上面的代碼應該如此編寫(注意@RequestParam部分),項目裏這樣的用法太多了,所以就用指定debug=true的方法了。
- @RequestMapping(value = "/security/login", method = RequestMethod.POST)
- public ModelAndView login(@RequestParam("userName") String userName,
- @RequestParam("password") String password,
- HttpServletRequest request) {
- ......................
-