天天看点

struts2 依赖注入boolean类型的属性时报错

使用ide:eclipse;

struts2的版本:2.3.4.1

登录界面代码如下:

struts2 依赖注入boolean类型的属性时报错

<?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 类型的)

struts2 依赖注入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为:

struts2 依赖注入boolean类型的属性时报错

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;  

struts2 依赖注入boolean类型的属性时报错

但是登录时报错:

struts2 依赖注入boolean类型的属性时报错

警告: 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,就好了。

struts2 依赖注入boolean类型的属性时报错

public void setisboy(boolean isboy) {  

总结:如果要依赖注入的属性是boolean类型并且属性名以is开头,就会出现上述问题。

解决方法:

如果使用struts2的依赖注入,那么boolean 类型的属性名不要以is开头。我修改方法是把属性名由isboy改为boy:

struts2 依赖注入boolean类型的属性时报错

    private boolean boy;  

        return boy;  

    public void setboy(boolean boy) {  

        this.boy = boy;  

 登录页面中把user.isboy 改为user.boy 就好了。

继续阅读