Struts2常见异常与分析处理【不断更新】
1、ognl.OgnlException: target is null for setProperty 异常原因之1
分析处理:
在action中有:
private transient Filmrlspack filmrlspack;
/**
*这里省略了getter、setter方法的代码
*/ 提交数据的表单代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<form method="post" name="wmfForm" id="wmfForm" action="">
<span id="wmf-msg"></span>
<table width="700" border="0" cellspacing="0" cellpadding="0" class="sample">
<tr>
<td>影片发行版名称:</td>
<td><input type="text" readonly="readonly" name="Filmrlspack.filmname" value="<%=request.getParameter("filmname") %>" /></td>
<td>业务类型:</td>
<td><input type="hidden" name="businesstypeID" value="<%=request.getParameter("businesstypeID") %>" /><input type="text" name="businesstypeName" readonly="readonly" value="<%=request.getParameter("businesstypeName") %>" /></td>
</tr>
<tr>
<td>出品单位:</td>
<td><input type="text" name="Filmrlspack.manufacture" /></td>
<td>出品年代:</td>
<td><input type="text" name="Filmrlspack.manufacturedate" /></td>
</tr>
<tr>
<td>导演:</td>
<td><input type="text" name="Filmrlspack.directors" /></td>
<td>主演:</td>
<td><input type="text" name="Filmrlspack.leaderact" /></td>
</tr>
<tr>
<td>语种:</td>
<td><input type="text" name="Filmrlspack.langtype" /></td>
<td>是否主语种:</td>
<td><input type="checkbox" name="Filmrlspack.maintype" value="1" checked="checked" /></td>
</tr>
<tr>
<td>影片描述:</td>
<td colspan="3"><textarea rows="5" cols="75" name="Filmrlspack.filmname" ></textarea></td>
</tr>
</table>
</form> 其中很多字段为非必填字段,若什么都不填提交到action中为null,报以上异常。
把action中的
private transient Filmrlspack filmrlspack;
/**
*这里省略了getter、setter方法的代码
*/
改成
private transient Filmrlspack filmrlspack = new Filmrlspack();
/**
*这里省略了getter、setter方法
*/ 就可以了。
2. ognl.OgnlException: target is null for setProperty 异常原因之2
问题是这样的,实体对象一定要有一个无参数的构造函数。否则就会报-------异常:ognl.OgnlException: target is null for setProperty
这个是在页面提交时,通过ognl,先调用无参数的构造函数,然后再调用相应的setter方法去可构造实体对象,没有无参数的构造函数,当然报错了,加上一个无参数的构造函数就OK
3. ognl.OgnlException: target is null for setProperty 异常原因之1补
Struts target is null for setProperty(null, "x", [Ljava.lang.String;@179da9f)
关键字: struts2 struts.devmode
上午工作中出现了这样一个异常:
ognl.OgnlException: target is null for setProperty(null, "x", [Ljava.lang.String;@1a48515)
ognl.OgnlException: target is null for setProperty(null, "y", [Ljava.lang.String;@1d57c7)
好像是我表单里面有多少个提交项后台就抛出多少对这样的异常信息。
可是我的表单里面是没有X,Y这样的提交信息的。。。很是郁闷,而其在前期的开发中也出现过这样的异常,虽然后台抛出这样的异常,但是它不影响程序的正常运行,所以一直也就没管它。今天又苦苦寻觅了许久终于搞定了。。
原来,我提交表单的按钮是如下定义的:
<input type="image" name="Submit" value="提交" onclick="return checkpwd();" src="images/a_tj.gif"/>
只要标签里面的type="image"那么这个带图片的按钮就能提交表单,而且还能在图片上加汉字。原来以为是个好的发现。呵呵,但是今天却发现问题就处在它身上。
当我把提交的按钮换成如下定义:
<input type="submit" name="bu1" onclick="return checkpwd();"/>
好了,一切OK了。没有异常了。
上面的带图片的按钮是美工给的,因此在asp和php应该都没问题,主要是因为Struts2的问。
struts.xml文件里面有这么一个"struts.devMode"。当设为true时,html表单数据中有和action属性匹配不上的参数名时就会提示这样的信息。我试了一下,果然如此,因此在开发过程中将这个属性设为true还是不错的,可以帮我们发现一些可能出现的问题。
这个错误信息主要因为struts.devMode = true引起,因为使用struts在默认配置下对任何提交到action的参数强制需要setter方法,而我们在使用token的时候一般都没有正确的为每一个token设置该参数,为此提交的token信息就会在这里一起一些错误信息,如果需要屏蔽掉这些的话,可以设置webwork.devMode = false来避免这种错误信息的抛出,当然这些错误在程序调试的时候是有用处了,我们可以根据这些信息来删除不必要的参数
Xml代码
<constant name="struts.devMode" value="true"/>
4、Caused by: There is no result type defined for type ‘redirect-action’ mapped with name
分析处理:
在struts.xml中配置如下:
<global-results>
<result name="login" type="redirect-action">redirectLoginAction</result>
</global-results> 报以上异常,用的Struts2包版本为2.1.8.1,后来查看了jar包中的struts-default.xml,发现type中没有redirect-action这一类型,而是变成了redirectAction,把type=”redirect-action”改成type=”redirectAction”就不会有这个异常了。