Struts2 ognl.NoSuchPropertyException

本文探讨了在Struts2框架中版本2.1.6的一个问题,即使用redirect类型的结果集时发生的NoSuchPropertyException异常。该异常发生在尝试设置重定向URL参数时,并给出了解决方案——升级到Struts2 2.1.8版本。

Struts2 2.1.6

@Result(name = "workflowconf", location = "workflowconf.action", type = "redirect", params = {"id", "%{id}" })

即使你在workflowconf.action里面加了SetId();还是会报出异常:
Caused by: ognl.NoSuchPropertyException: org.apache.struts2.dispatcher.ServletRedirectResult.id
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:132)
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:27)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:1656)
at ognl.ASTProperty.setValueBody(ASTProperty.java:101)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:177)
at ognl.SimpleNode.setValue(SimpleNode.java:246)
at ognl.Ognl.setValue(Ognl.java:476)
at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:197)
at com.opensymphony.xwork2.ognl.OgnlUtil.internalSetProperty(OgnlUtil.java:393)

Struts2的BUG
Struts2.1.8已经修复
所以,升级

`NoSuchPropertyException` 是一种在某些 Java 框架或库中抛出的异常,通常表示试图访问一个不存在的属性(字段、getter/setter 方法等),而不是 Java 标准库中的原生异常。它通常出现在以下场景中: - 使用反射访问对象属性时 - 使用 Map 或某些 ORM 框架(如 MyBatis、Hibernate) - 使用 EL 表达式(如在 JSP 页面中) - 使用某些 JSON 解析库(如 Fastjson、Jackson 配置不当) --- ## ✅ 示例场景 ### 场景1:使用 Apache Commons BeanUtils 获取不存在的属性 ```java import org.apache.commons.beanutils.BeanUtils; public class Test { public static void main(String[] args) { try { User user = new User(); String value = BeanUtils.getSimpleProperty(user, "nonExistentField"); } catch (Exception e) { e.printStackTrace(); } } } class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` 输出可能包括: ``` java.lang.IllegalArgumentException: No such property: nonExistentField ``` --- ### 场景2:使用 OGNL 表达式访问不存在的属性(常见于 Struts2) ```java import ognl.Ognl; import ognl.OgnlContext; import ognl.OgnlException; public class OgnlTest { public static void main(String[] args) throws OgnlException { OgnlContext context = new OgnlContext(); User user = new User(); Object value = Ognl.getValue("nonExistentField", context, user); } } ``` 输出: ``` ognl.NoSuchPropertyException: User.nonExistentField ``` --- ## 🔍 异常原因分析 - 你试图访问一个对象中不存在的属性。 - 通常是由于拼写错误、字段未定义 getter/setter 方法,或者动态访问 Map 等结构时键不存在。 - 在反射框架中,如果没有对属性存在性做检查,就可能抛出此类异常。 --- ## ✅ 解决方案 ### ✅ 方案1:使用 `PropertyDescriptor` 检查属性是否存在(Java Beans) ```java import java.beans.PropertyDescriptor; import java.lang.reflect.Method; public class PropertyCheck { public static boolean hasProperty(Object obj, String propertyName) { try { PropertyDescriptor pd = new PropertyDescriptor(propertyName, obj.getClass()); Method getter = pd.getReadMethod(); return getter != null; } catch (Exception e) { return false; } } public static void main(String[] args) { User user = new User(); System.out.println(hasProperty(user, "name")); // true System.out.println(hasProperty(user, "age")); // false } } ``` --- ### ✅ 方案2:使用 Map 判断属性是否存在(适用于 Map 类型) ```java import java.util.HashMap; import java.util.Map; public class MapCheck { public static void main(String[] args) { Map<String, Object> map = new HashMap<>(); map.put("name", "Alice"); if (map.containsKey("name")) { System.out.println("name 存在"); } if (!map.containsKey("age")) { System.out.println("age 不存在"); } } } ``` --- ### ✅ 方案3:使用 try-catch 包裹调用(不推荐,仅作兼容) ```java try { String value = BeanUtils.getSimpleProperty(user, "nonExistentField"); } catch (Exception e) { if (e instanceof IllegalArgumentException) { System.out.println("属性不存在"); } else { e.printStackTrace(); } } ``` --- ## 🔍 如何避免 NoSuchPropertyException? | 建议 | 说明 | |------|------| | 检查属性是否存在 | 使用 `PropertyDescriptor` 或 `Map.containsKey()` | | 使用 IDE 提示 | 避免拼写错误 | | 使用 Lombok 自动生成 getter/setter | 确保属性可访问 | | 对 Map 使用 Optional | 避免访问不存在的 key | --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值