使用ide:eclipse;
struts2的版本:2.3.4.1
登入界面代碼如下:

<?xml version="1.0" encoding="utf-8" ?>
<%@ page language="java" contenttype="text/html; charset=utf-8"
pageencoding="utf-8"%>
<%
string path = request.getcontextpath();
string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>login</title>
</head>
<body>
<center>
<h1>login platform</h1>
<s:form action="/login" method="post" >
<table>
<tr><td>username:</td> <td><s:textfield name="user.username" ></s:textfield> </td></tr>
<tr><td>password:</td> <td><s:textfield name="user.password" ></s:textfield> </td></tr>
<tr><td>age:</td> <td><s:textfield name="user.age" ></s:textfield> </td></tr>
<tr><td>isboy:</td> <td><s:textfield name="user.isboy" ></s:textfield> </td></tr>
<tr> <td colspan="2"><s:submit value="login" ></s:submit> </td></tr>
</table>
</s:form>
</center>
</body>
</html>
對應的bean中有一個成員變量是:private boolean isboy;(是boolean 類型的)

package com.jn.bean;
public class loginuser {
private int age;
private string username;
private string password;
/***
* 是否是男性
*/
private boolean isboy;
public loginuser() {
super();
}
public int getage() {
return age;
public void setage(int age) {
this.age = age;
public string getusername() {
return username;
public void setusername(string username) {
this.username = username;
public string getpassword() {
return password;
public void setpassword(string password) {
this.password = password;
public boolean isboy() {
return isboy;
public void setboy(boolean isboy) {
this.isboy = isboy;
}
其中的getter,setter方法都是使用eclipse自動生成的。
對應的action為:

package com.jn.action;
import com.jn.bean.loginuser;
import com.opensymphony.xwork2.actionsupport;
public class loginverifyaction extends actionsupport {
private static final long serialversionuid = -5532496750392156543l;
private loginuser user;
@override
public string execute() throws exception {
system.out.println("user information:");
system.out.println("username:"+user.getusername());
system.out.println("password:"+user.getpassword());
system.out.println("age:"+user.getage());
system.out.println("isboy:"+user.isboy());
return super.execute();
public loginuser getuser() {
return user;
public void setuser(loginuser user) {
this.user = user;
但是登入時報錯:

警告: error setting expression 'user.isboy' with value '[ljava.lang.string;@863941'
ognl.nosuchpropertyexception: com.jn.bean.loginuser.isboy [java.lang.illegalaccessexception: class ognl.ognlruntime can not access a member of class com.jn.bean.loginuser with modifiers "private"]
at ognl.ognlruntime.setfieldvalue(ognlruntime.java:1682)
at ognl.objectpropertyaccessor.setpossibleproperty(objectpropertyaccessor.java:87)
at ognl.objectpropertyaccessor.setproperty(objectpropertyaccessor.java:162)
at com.opensymphony.xwork2.ognl.accessor.objectaccessor.setproperty(objectaccessor.java:27)
at ognl.ognlruntime.setproperty(ognlruntime.java:2315)
at ognl.astproperty.setvaluebody(astproperty.java:127)
at ognl.simplenode.evaluatesetvaluebody(simplenode.java:220)
at ognl.simplenode.setvalue(simplenode.java:301)
at ognl.astchain.setvaluebody(astchain.java:227)
at ognl.ognl.setvalue(ognl.java:737)
at com.opensymphony.xwork2.ognl.ognlutil.setvalue(ognlutil.java:217)
at com.opensymphony.xwork2.ognl.ognlvaluestack.trysetvalue(ognlvaluestack.java:186)
at com.opensymphony.xwork2.ognl.ognlvaluestack.setvalue(ognlvaluestack.java:173)
at com.opensymphony.xwork2.ognl.ognlvaluestack.setparameter(ognlvaluestack.java:151)
at com.opensymphony.xwork2.interceptor.parametersinterceptor.setparameters(parametersinterceptor.java:317)
at com.opensymphony.xwork2.interceptor.parametersinterceptor.dointercept(parametersinterceptor.java:228)
at com.opensymphony.xwork2.interceptor.methodfilterinterceptor.intercept(methodfilterinterceptor.java:98)
at com.opensymphony.xwork2.defaultactioninvocation.invoke(defaultactioninvocation.java:249)
at com.opensymphony.xwork2.interceptor.parametersinterceptor.dointercept(parametersinterceptor.java:236)
at com.opensymphony.xwork2.interceptor.staticparametersinterceptor.intercept(staticparametersinterceptor.java:190)
at org.apache.struts2.interceptor.multiselectinterceptor.intercept(multiselectinterceptor.java:75)
at org.apache.struts2.interceptor.checkboxinterceptor.intercept(checkboxinterceptor.java:90)
at org.apache.struts2.interceptor.fileuploadinterceptor.intercept(fileuploadinterceptor.java:243)
at com.opensymphony.xwork2.interceptor.modeldriveninterceptor.intercept(modeldriveninterceptor.java:100)
at com.opensymphony.xwork2.interceptor.scopedmodeldriveninterceptor.intercept(scopedmodeldriveninterceptor.java:141)
at com.opensymphony.xwork2.interceptor.chaininginterceptor.intercept(chaininginterceptor.java:145)
at com.opensymphony.xwork2.interceptor.prepareinterceptor.dointercept(prepareinterceptor.java:171)
at com.opensymphony.xwork2.interceptor.i18ninterceptor.intercept(i18ninterceptor.java:176)
at org.apache.struts2.interceptor.servletconfiginterceptor.intercept(servletconfiginterceptor.java:164)
at com.opensymphony.xwork2.interceptor.aliasinterceptor.intercept(aliasinterceptor.java:192)
at com.opensymphony.xwork2.interceptor.exceptionmappinginterceptor.intercept(exceptionmappinginterceptor.java:187)
at org.apache.struts2.impl.strutsactionproxy.execute(strutsactionproxy.java:54)
at org.apache.struts2.dispatcher.dispatcher.serviceaction(dispatcher.java:511)
at org.apache.struts2.dispatcher.ng.executeoperations.executeaction(executeoperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter.dofilter(strutsprepareandexecutefilter.java:91)
at org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:243)
at org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210)
at org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:222)
at org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:123)
at org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:472)
at org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:171)
at org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:99)
at org.apache.catalina.valves.accesslogvalve.invoke(accesslogvalve.java:953)
at org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:118)
at org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:408)
at org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1023)
at org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:589)
at org.apache.tomcat.util.net.jioendpoint$socketprocessor.run(jioendpoint.java:310)
at java.util.concurrent.threadpoolexecutor$worker.runtask(threadpoolexecutor.java:886)
at java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:908)
at java.lang.thread.run(thread.java:662)
caused by: java.lang.illegalaccessexception: class ognl.ognlruntime can not access a member of class com.jn.bean.loginuser with modifiers "private"
at sun.reflect.reflection.ensurememberaccess(reflection.java:65)
at java.lang.reflect.field.dosecuritycheck(field.java:960)
at java.lang.reflect.field.getfieldaccessor(field.java:896)
at java.lang.reflect.field.set(field.java:657)
at ognl.ognlruntime.setfieldvalue(ognlruntime.java:1674)
... 67 more
/-- encapsulated exception ------------\
java.lang.illegalaccessexception: class ognl.ognlruntime can not access a member of class com.jn.bean.loginuser with modifiers "private"
\--------------------------------------/
錯誤資訊說明,struts2沒有找到isboy 的setter方法,因為struts2認為isboy 的setter方法名應該是setisboy
為什麼會設定isboy時就有問題呢?因為按照struts2 的依賴注入規則,setter方法應該是set+成員變量(首字母變為大寫)。
我把isboy的setter方法由setboy 修改為setisboy,就好了。

public void setisboy(boolean isboy) {
總結:如果要依賴注入的屬性是boolean類型并且屬性名以is開頭,就會出現上述問題。
解決方法:
如果使用struts2的依賴注入,那麼boolean 類型的屬性名不要以is開頭。我修改方法是把屬性名由isboy改為boy:

private boolean boy;
return boy;
public void setboy(boolean boy) {
this.boy = boy;
登入頁面中把user.isboy 改為user.boy 就好了。