【问题标题】:Spring: Bean property is not writable or has an invalid setter methodSpring:Bean属性不可写或具有无效的setter方法
【发布时间】:2023-03-25 07:30:02
【问题描述】:

我知道这个问题已被多次问过,但在我看来一切都是正确的。我还从 Eclipse 中删除了我的代码,让 IDE 创建 getter/setter 但无济于事。

这是我在 weblogic 中的错误:

原因:org.springframework.beans.NotWritablePropertyException:bean 类 [com.fedex.dire.webservices.direservice.dao.GPSDataDaoImpl] 的无效属性“gpsDataAllStopsSql”:Bean 属性“gpsDataAllStopsSql”不可写或无效设置方法。 setter的参数类型和getter的返回类型是否匹配?

这是我上下文中的 Bean 和属性:

<bean id="dataDao" class="com.text.service.dao.DataDaoImpl" >
      <property name="dataSource" ref="dataSource" />
      <property name="gpsDataAllStopsSql">
          <value><![CDATA[SELECT A.XML_DATA,B.ADDR1,B.ADDR2,B.POSTALCODE  FROM GPS.EVENT_STAMP A LEFT OUTER JOIN DB.SCAN B ON  A.FAC_IORG_NBR=B.FACILITY AND A.SCANNER_DATE=B.SCANDATE AND A.SCANNER_ID=B.SCANNERID AND A.PD_START_TIME=B.PDSTART WHERE FAC_IORG_NBR = ?  AND SCANNER_DATE = CAST(? AS DATE) AND SCANNER_ID = ? AND PD_START_TIME = ?]]></value>
    </property> 
      <property name="gpsDataSql">
          <value><![CDATA[SELECT A.XML_DATA,A.STOP_NUMBER,B.ADDR1,B.ADDR2,B.POSTALCODE FROM GPS.EVENT_STAMP A LEFT OUTER JOIN DB.SCAN B ON  A.STOP_NUMBER=B.STOP# AND A.FAC_IORG_NBR=B.FACILITY AND A.SCANNER_DATE=B.SCANDATE AND A.SCANNER_ID=B.SCANNERID AND A.PD_START_TIME=B.PDSTART WHERE FAC_IORG_NBR = ?  AND SCANNER_DATE = CAST(? AS DATE) AND SCANNER_ID = ? AND PD_START_TIME = ? AND STOP_NUMBER = ?]]></value>
 </property> 
 </bean>

这是我的 DaoImpl 中的 getter 和 setter 方法:

private static String gpsDataSql = null;

private static String gpsDataAllStopsSql = null;

public static String getGpsDataSql() {
    return gpsDataSql;
}

public static void setGpsDataSql(String gpsDataSql) {
    DataDaoImpl.gpsDataSql = gpsDataSql;
}

public static String getGpsDataAllStopsSql() {
    return gpsDataAllStopsSql;
}

public static void setGpsDataAllStopsSql(String gpsDataAllStopsSql) {
    DataDaoImpl.gpsDataAllStopsSql = gpsDataAllStopsSql;
}

我的眼睛是否在滑过什么东西,还是我的环境有其他问题?

谢谢!

【问题讨论】:

  • 可能是setter方法签名中的那个静态关键字。
  • Excatly:为什么你有用于 getter 和 setter 的静态字段和方法。更好的选择是使用单例范围的 spring bean - 如果其余的 dao 代码是无状态的。
  • 哇确实掩盖了那个。谢谢。我确定就是这样,因为默认情况下 Eclipse 在我的机器上设置为静态

标签: java spring spring-mvc


【解决方案1】:

您在 XML 中声明的 bean 尝试设置存在于 DataDaoImpl 类上的属性。为了使其正常工作,请删除静态成员并为您的班级尝试以下操作:

package com.text.service.dao;

public class DataDaoImpl extends SomeOtherDaoWhereDataSourceIsDefined {
    private String gpsDataAllStopsSql;
    private String gpsDataSql;

    public String getGpsDataAllStopsSql() {
        return gpsDataAllStopsSql;
    }

    public void setGpsDataAllStopsSql(String gpsDataAllStopsSql) {
        this.gpsDataAllStopsSql = gpsDataAllStopsSql;
    }

    public String getGpsDataSql() {
        return gpsDataSql;
    }

    public void setGpsDataSql(String gpsDataSql) {
        this.gpsDataSql = gpsDataSql;
    }
}

This article 解释了静态与非静态成员的用法。

【讨论】:

    猜你喜欢
    • 2015-09-07
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2013-06-11
    • 2015-03-03
    • 1970-01-01
    相关资源
    最近更新 更多