关于Struts的BeanUtils.populate与LazyDynaBean联用

本文探讨了使用BeanUtils.populate方法时出现的Nobeanspecified异常问题。通过实例分析,指出了异常产生的原因在于传入的参数不符合Bean的属性结构,并提供了两种解决方案:一是调整前端参数名称,二是预先在Map中定义好相应的Bean。
有这样一段代码:
            LazyDynaBean ll = new LazyDynaBean();
            
try {
                BeanUtils.populate(ll, request.getParameterMap());
            }
 catch (IllegalAccessException e) {
                e.printStackTrace();
            }
 catch (InvocationTargetException e) {
                e.printStackTrace();
            }

            Map params 
= ll.getMap();
以前运行过几次,都没什么问题.但是最近一个朋友用的时候却碰到了异常.
异常信息如下:

java.lang.IllegalArgumentException: No bean specified
 at org.apache.commons.beanutils.PropertyUtilsBean.getPropertyDescriptor(PropertyUtilsBean.java:751)
 at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:937)
 at org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
 at org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
 at com.accp.t02.vss02.service.web.action.CstServiceAction.searchForDispatch(CstServiceAction.java:149)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
 at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
 at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
 at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
 at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at com.accp.t02.vss02.filter.LanguageFilter.doFilter(LanguageFilter.java:21)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
 at java.lang.Thread.run(Thread.java:619)

我查来查去..始终觉得不是这段代码的问题
后来经过本人的不懈努力,,终于找到了问题的根源
原来BeanUtils.populate会自动解释传进来的参数..比如传进来的参数是
aa.bb,那么他就去找bean的aa属性中的bb属性...
而上面的代码使用的是一个map.没有aa.不能自动填充它的bb属性..就报了没有bean定义的异常..
解决该异常的方法:
1.将页面的参数名改为不带"."的参数
2:在map中添加需要的bean
<think>首先,用户的问题是:“BeanUtils.populate(items1, map);什么意思”,这是在使用中文回答问题。我需要确保我的回答是中文的。 问题是关于Java代码的:BeanUtils.populate(items1, map); 我需要解释这个语句的意思。 回想一下:BeanUtilsApache Commons BeanUtils库中的一个类。populate方法是用来将一个Map中的键值对填充到一个JavaBean对象的属性中。这里的items1可能是一个JavaBean对象的实例,而map是一个Map对象,包含属性名和值。 解释的关键点: - BeanUtils.populate(Object bean, Map properties):这个方法将Map中的每个键值对设置到bean对象的相应属性上。 - 例如,如果map有键"name",值"John",那么bean的setName("John")方法会被调用。 - 这在处理表单数据或配置时很有用,可以将请求参数映射到对象。 我的回答应该清晰、简洁,并用中文解释。 接下来,规则要求:在回答完问题后,必须提出3-5个相关问题。输出必须以“§§相关问题§§”开头(第一行),然后列出问题,禁止换行分散。意思是问题列表不能有换行符分散内容,应该连续列出,但根据示例,它是分行列出的数字列表。 看示例: ``` §§相关问题§§ 1. ··· 2. ··· 3. ··· ``` 所以,我需要输出: 第一行:“§§相关问题§§” 然后,按数字列出3-5个相关问题。 相关问题应该基于用户的问题和我的回答。用户的问题是“BeanUtils.populate(items1, map);什么意思”,所以我解释后,相关问题可以围绕BeanUtilspopulate方法、相关概念等。 脑storm相关问题: 1. BeanUtils.populate方法的具体参数是什么? 2. 使用BeanUtils.populate时需要注意什么(比如属性类型匹配)? 3. 除了populateBeanUtils还有哪些常用方法? 4. 在Spring框架中,是否有类似的工具? 5. 如何避免使用BeanUtils时的异常? 选择3-5个,比如说4个: 1. BeanUtils.populate方法的参数bean和properties有何要求? 2. 如果map中的键在bean中没有对应属性,会发生什么? 3. 除了Apache Commons BeanUtils,还有其他库提供类似功能吗? 4. 使用BeanUtils.populate时如何确保安全性和性能? 确保输出格式: - 先回答问题。 - 然后新行输出“§§相关问题§§” - 然后分行列出问题,每个问题以数字开头,如“1. ...” 规则说:“禁止换行分散”,但在示例中是分行列出的,所以我认为分行是可以的,只要不是不必要的分散。意思是问题列表应该紧凑,不要有空行。 最终回答结构: - 回答部分:解释BeanUtils.populate的意思。 - 然后:§§相关问题§§ - 然后:1. [问题1] 2. [问题2] 3. [问题3] 4. [问题4] 确保所有内容符合规则。 现在,撰写回答的中文部分: 回答:"BeanUtils.populate(items1, map); 的意思是将map中的键值对填充到items1这个JavaBean对象的属性中。具体来说,这个方法来自Apache Commons BeanUtils库,它会遍历map中的每个条目,调用items1的setter方法(如setPropertyName)来设置对应的值。例如,如果map有键"name"和值"John",则会调用items1.setName("John")。" 保持简洁。 然后,相关问题: 1. BeanUtils.populate方法的核心参数有哪些限制? 2. 当map中的键在items1中没有对应属性时,如何处理? 3. 除了populateBeanUtils还提供哪些常用功能? 4.Java中,是否有其他库可以替代BeanUtils进行属性填充? </think>BeanUtils.populate(items1, map); 是来自Apache Commons BeanUtils库的一个方法调用,用于将一个Map对象(map)中的键值对填充到一个JavaBean对象(items1)的属性中。具体来说: - **items1** 是一个JavaBean实例(通常是一个POJO类对象),例如一个User对象。 - **map** 是一个键值对集合(通常是Map<String, Object>类型),键表示属性名(如"name"),值表示要设置的属性值(如"John")。 - 方法执行时,它会遍历map中的每个条目,并调用items1中对应的setter方法(如setName())来设置属性值。例如,如果map包含键"age"值25,则会尝试调用items1.setAge(25)。这在Web开发中常用于将HTTP请求参数快速映射到Java对象。 注意:使用前需导入Apache Commons BeanUtils库。如果属性类型不匹配或setter方法不存在,可能会抛出异常(如IllegalAccessException或InvocationTargetException)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值