解決一個運行期問題

用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模式下編譯,其參數名稱才存儲在編譯好的代碼中。 


譬如下面的代碼會引發異常: 

Java代碼  收藏代碼
  1. @RequestMapping(value = "/security/login", method = RequestMethod.POST)  
  2. public ModelAndView login(@RequestParam String userName, @RequestParam String password,   
  3.     HttpServletRequest request) {  
  4.     ......................  


如果使用Eclipse編譯不會在運行時出現異常,這是因爲Eclipse默認是採用debug模式編譯的,但是如果使用Ant通過javac任務編譯的話就會出現異常,除非指定debug=”true”。

當然,最好的做法是通過@RequestParam註解指定具體的參數名稱,如,上面的代碼應該如此編寫(注意@RequestParam部分),項目裏這樣的用法太多了,所以就用指定debug=true的方法了。 

Java代碼  收藏代碼
  1. @RequestMapping(value = "/security/login", method = RequestMethod.POST)   
  2. public ModelAndView login(@RequestParam("userName") String userName,   
  3.     @RequestParam("password") String password,    
  4.     HttpServletRequest request) {   
  5.     ......................  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章