Glassfish无法识别首字母大写标签属性的setter方法求助
问题根源
你遇到的核心问题是不同JSP容器对首字母大写标签属性与JavaBean setter的映射规则不一致:JRun这类旧版容器对属性名大小写的处理更宽松,而Glassfish 5遵循更严格的JavaBean规范和JSP 2.x规范,导致无法匹配到你已有的setHeight方法。
当标签属性名为Height(首字母大写、第二个字母小写)时,Glassfish的JSP处理器会默认按照JavaBean Introspector的规则,将属性名首字母转为小写(即认为属性是height),但你的标签属性名是大写的Height,两者映射错位,因此抛出找不到setter的错误。
无需修改JSP属性名的解决方案
你不需要改动大量JSP中的Height属性名,只需要通过自定义BeanInfo类显式指定属性与setter的映射关系,就能让Glassfish正确识别:
步骤1:创建BeanInfo类
在com.test.taglib包下创建DataTableTagBeanInfo.java,代码如下:
package com.test.taglib; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.beans.SimpleBeanInfo; public class DataTableTagBeanInfo extends SimpleBeanInfo { @Override public PropertyDescriptor[] getPropertyDescriptors() { try { // 获取父类的属性描述符 BeanInfo superBeanInfo = Introspector.getBeanInfo(DataTableTag.class, Object.class); PropertyDescriptor[] originalDescriptors = superBeanInfo.getPropertyDescriptors(); // 创建Height属性的描述符,明确指定对应的setter方法为setHeight PropertyDescriptor heightDescriptor = new PropertyDescriptor( "Height", DataTableTag.class, null, // 此处不需要getter方法,传null即可 "setHeight" ); // 合并原有描述符和新的Height描述符 PropertyDescriptor[] newDescriptors = new PropertyDescriptor[originalDescriptors.length + 1]; System.arraycopy(originalDescriptors, 0, newDescriptors, 0, originalDescriptors.length); newDescriptors[originalDescriptors.length] = heightDescriptor; return newDescriptors; } catch (IntrospectionException e) { e.printStackTrace(); return super.getPropertyDescriptors(); } } }
步骤2:编译部署
将这个类编译后,和你的DataTableTag类一起部署到Glassfish中。JavaBean Introspector会自动识别这个BeanInfo类,显式告知容器Height属性对应的setter方法就是你已实现的setHeight。
为什么你之前尝试的方法无效
你试过的setheight、settheight等方法,都不符合Glassfish遵循的JavaBean规范映射逻辑;而setHeight本身是符合规范的,但因为容器默认将大写属性名Height转为小写height,导致映射错位,所以无法被识别——自定义BeanInfo正是解决了这个规则冲突的问题。
内容的提问来源于stack exchange,提问作者coke 2_0

