You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Glassfish无法识别首字母大写标签属性的setter方法求助

解决Glassfish中JSP标签首字母大写属性的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:42:53