Spring、NotReadablePropertyException 和 Glassfish 版本

2024-03-09

我正在开发一个使用 Spring MVC 的 Web 应用程序。

它在 Glassfish 3.0.1 上运行良好,但当迁移到 Glassfish 3.1 时,它开始表现得很奇怪。有些页面仅部分显示,或根本不显示任何内容,并且在日志中,有很多此类消息:

    [#|2012-08-30T11:50:17.582+0200|WARNING|glassfish3.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=69;_ThreadName=Thread-1;|StandardWrapperValve[SpringServlet]: PWC1406: Servlet.service() for servlet SpringServlet threw exception
    org.springframework.beans.NotReadablePropertyException: Invalid property 'something' of bean class [com.something.Something]: Bean property 'something' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
        at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:729)
        at org.springframework.beans.BeanWrapperImpl.getNestedBeanWrapper(BeanWrapperImpl.java:576)
        at org.springframework.beans.BeanWrapperImpl.getBeanWrapperForPropertyPath(BeanWrapperImpl.java:553)
        at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:719)
        at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99)
        at org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:226)
        at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:120)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:178)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:198)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:164)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:127)
        at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:421)
        at org.springframework.web.servlet.tags.form.TextareaTag.writeTagContent(TextareaTag.java:95)
        at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
        at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)

该错误消息并非不正确,因为相关属性没有 setter 方法(通过构造函数获取其值)。但正如我所说,使用 Glassfish 3.0.1 时这并不是问题,只有在装有 Glassfish 3.1 的新服务器上使用时才会出现问题。

有谁知道 Glassfish 版本中是否有某些东西可能导致此问题?或者新服务器上缺少某种配置?

一些代码:

控制器:

@ModelAttribute
public SomethingContainer retriveSomethingContainer(@PathVariable final long id {
    return somethingContainerDao.retrieveSomethingContainer(id);       
}

@InitBinder("somethingContainer")
public void initBinderForSomething(final WebDataBinder binder) {
    binder.setAllowedFields(new String[] {
        "something.title",
        "something.description",
    });
}

东西容器:

@Embedded
private final Something something = new Something();

public Something getSomething() {
    return something;
}
//no setter

public String getDescription() {
    return something.getDescription();
}

Update:

重新启动 Glassfish 实际上可以暂时解决该问题。我怀疑这可能与加载自定义活页夹有关,我们遇到了一些内存不足错误的问题,我认为这与此有关,但已修复但没有修复此问题。

更新2:

在 3.0.1 服务器上,jvm 参数之一是 -client。在 3.1-server 上,它是 -server。我们将其更改为-client,这使得错误的频率下降了很多,使用-server时每隔一天就会发生一次,使用-client时花了两周时间才发生。

更新3:

有关服务器的一些信息(如果需要,可以添加更多信息..)

Server1(工作服务器):

Windows Server 2003
Java jdk 6 build 35
Glassfish 3.0.1 build 22
-xmx 1024m

Server2(有问题的服务器):

Windows Server 2008 64-bit
Java jdk 6 build 31
Glassfish 3.1 build 43
-xmx 1088m
-xms 1088m

我们使用 Spring 版本 3.1.0。

更新4:

我通过将 jsp 中的字段重命名为 modelattribute 中不存在的字段来重新创建错误。

但是,更重要的是,我注意到了一些事情:系统找不到 getter 的字段通常是 ​​modelattribute 中引用的字段的超类字段。继续我的示例,SomthingContainer 实际上是这样的:

public class SuperSomethingContainer {
    [...]
    private Something something;
    public Something getSomething() {
        return something;
    }
}

public class SomethingContainer extends SuperSomethingContainer {
    [...]
}

控制器中的引用保持原样,因此它引用相关对象的超类中的字段。

更新5:

发生错误后,我尝试使用调试器连接到生产服务器。我在返回有错误的对象的控制器方法的 return 语句上放置了一个断点,并尝试查看当时是否可以访问有问题的字段。我可以,所以问题一定出在 Spring MVC/生成的 jsp 类中。

(另外,错误的字段的类型为“someobject.something[0].somethingelse[0]”,但是当somethingelse-list为空时,没有错误!对我来说,这意味着它不能以某种方式查找列表的 get 方法(?))

更新6:

问题似乎与从 jsps 生成 Java 类有关。我们在部署的时候没有使用预编译jsps,所以第一次使用的时候就编译了。第一次访问页面并编译 jsp 时会出现此问题。我还注意到,一旦出现这个问题,之后编译的jsp都会报错。我保留了一些问题生成的 java 文件,下次重新启动时我会将它们与工作文件进行比较。越来越近 :)

更新7:

将编译后出现错误的jsp java 文件与没有出现错误的jsp java 文件进行比较,没有什么区别。所以这有点遗漏了。

所以,我现在知道离开控制器的 Java 对象很好(用调试器检查),并且从 jsp 生成的 java 类也很好。所以它一定是介于两者之间,现在我需要找出什么......

更新8:

又一轮调试,进一步缩小了问题范围。事实证明,spring 对属于各个类的属性进行了一些缓存。在org.springframework.beans.BeanWrapperImpl中,方法getPropertyValue,有以下内容:

private Object getPropertyValue(PropertyTokenHolder tokens) throws BeansException {
    String propertyName = tokens.canonicalName;
    String actualName = tokens.actualName;
    PropertyDescriptor pd = getCachedIntrospectionResults().getPropertyDescriptor(actualName);
    if (pd == null || pd.getReadMethod() == null) {
        throw new NotReadablePropertyException(getRootClass(), this.nestedPath + propertyName);
    }

问题是 cachedIntrospectionResults 不包含有问题的属性,但它包含该类的所有其他属性。需要挖掘更多,试图找出它丢失的原因,是否从一开始就丢失了,或者是否在沿线的某个地方丢失了。

另外,我注意到缺少的属性是那些没有 setter,只有 getter 的属性。而且,正如堆栈跟踪所示,它似乎具有上下文感知能力。因此,在访问一个页面时未找到某个属性并不意味着在访问另一个页面时该属性不可用。

更新9:

又一天,进行更多调试。确实发现了一些好东西。上一个代码块中的 getCachedIntrospectionResults() 调用最终调用了 CachedIntrospectionResults#forClass(theClassInQuestion)。这返回了一个 CachedIntrospectionResults 对象,其中包含的属性远非所有预期属性(21 个属性中的 11 个)。进入 forClass 方法,我发现:

static CachedIntrospectionResults forClass(Class beanClass) throws BeansException {
    CachedIntrospectionResults results;
    Object value = classCache.get(beanClass);
    if (value instanceof Reference) {
        Reference ref = (Reference) value;
        results = (CachedIntrospectionResults) ref.get();
    }
    else {
        results = (CachedIntrospectionResults) value;
    }
    if (results == null) {
    //build the CachedIntrospectionResults, store it in classCache and return it.

原来,返回的CachedIntrospectionResults是通过classCache.get(beanClass)找到的。因此,存储在 classCache 中的内容已损坏/未包含应有的全部内容。我在 classCache.get(beanClass) 行上放置了一个断点,并尝试通过调试器运行它:

classCache.put(beanClass, null);

当允许该方法完成并重建 CachedIntrospectionResults 时,事情再次开始工作。因此,存储在 classCache 中的内容与如果允许重建的话将要创建的内容和应该创建的内容不同步。目前我不知道这是否是由于第一次构建时出现问题,或者 classCache 在某个地方被损坏。

我开始怀疑这与类加载器有关,因为我之前在更新 Glassfish 时遇到过由于类加载器工作方式发生变化而出现的问题。


可能的原因可能不止一个。我不确定实际情况,但我可以给你找出问题的方法

Step 1: on server 2机器上部署应用程序Glassfish 3.0.1 版本 22,现在如果在服务器 2 机器上工作正常,则意味着 Glass Fish 的库可能存在问题,以下可能是此问题的原因

  1. 中缺少的任何库Glassfish 3.1 版本 43那是在Glassfish 3.0.1 版本 22。您可以通过将所有库从工作 Glassfish 服务器复制到新服务器来解决。
  2. 我的 Glassfish 库与 spring 版本冲突。 [我在 tomcat 上遇到过类似的问题,当我将 spring 库从 3.0.1 替换为 3.0.3 时,它对我有用],因此将您的 spring 库替换为最新的库。

Step 2:如果步骤 1 的结果是应用程序未在 Glassfish 3.0.1 build 22 上的服务器 2 机器上运行,则可能有以下原因

  1. 如果您粘贴了任何库java lib要么不包含在此服务器计算机中,要么具有不同版本。

  2. 任何设置的文件夹类路径或使用任何环境变量在服务器 1 上,服务器 2 上不存在或者没有 jar 或具有不同版本的 jar

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring、NotReadablePropertyException 和 Glassfish 版本 的相关文章

随机推荐

  • SASL 握手期间出现意外的 METADATA 类型的 Kafka 请求

    我正在尝试使用 SASL Plain 将 Kafka Java 客户端连接到 Kafka 代理 但是当我尝试从生产者发送消息时 Kafka 服务器记录以下错误 2020 04 30 14 48 14 955 INFO SocketServe
  • 使用POSTMAN获取授权码-OAuth2.0

    我正在使用POSTMAN来测试OAuth2 0授权码流程对于 MSGraph 以下是相同的详细信息 验证码网址 https login microsoftonline com tenant id oauth2 authorize https
  • Tomcat环境中如何保存名称-值对?

    我们有一个 servlet 它需要某些变量 如密码 加密盐等 而不是永久保存在文件系统上 这就是我们目前所做的 总结 在初始化期间 Perl 脚本将 ReadMode 设置为 2 以屏蔽 stdout echo 提示用户输入变量 过滤已知文
  • 检查元素上是否有事件侦听器。没有 jQuery [重复]

    这个问题在这里已经有答案了 如果我像下面的代码一样使用内联函数 如何检查元素上是否有事件侦听器 因为我有一个函数可以调用该函数并添加事件侦听器 但它会导致重复的事件侦听器导致它触发函数两次 如果事件侦听器已经存在 我该如何检查它以便阻止它添
  • Rails 3.1 中的无表模型

    好像this http railscasts com episodes 193 tableless model该方法在 Rails 3 1 中不再适用 那么 有人有可行的解决方案吗 其实我已经找到这个了gist https gist git
  • 如何在编辑表单中预先填充collection_check_boxes?

    GitHub 仓库 https github com Yorkshireman mywordlist https github com Yorkshireman mywordlist 我用谷歌搜索了一下这个 我确信有一种方法 可能需要在 h
  • Python 字典中的最后一个键

    我很难弄清楚 Python 字典中最后一个键的语法是什么 我知道对于 Python 列表 人们可能会这样说来表示最后一个 list 1 我还知道可以获取字典的键列表 如下所示 dict keys 但是 当我尝试使用以下逻辑代码时 它不起作用
  • 在 ZF2 中发送带有附件的电子邮件

    如何在 zf2 中发送包含 text plain text html 和附件的电子邮件 我使用此代码通过 smtp 发送电子邮件 files this gt params gt fromFiles smtp new Zend Mail Tr
  • 如何使用 pyPdf 合并两个横向 pdf 页面

    我在使用 pyPdf 合并两个 PDF 文件时遇到问题 当我运行以下代码时 水印 第 1 页 看起来不错 但第 2 页已顺时针旋转 90 度 有什么想法吗 from pyPdf import PdfFileWriter PdfFileRea
  • 语法错误:无法分配给运算符

    def RandomString length distribution string for t in distribution t 1 length t 1 string return shuffle string 这会返回标题中描述的
  • Bash 错误:需要整数表达式

    在下面的部分中 您将看到我尝试在 UNIX 计算机上运行的 shell 脚本以及脚本 当我运行这个程序时 它给出了预期的输出 但它也给出了记录中显示的错误 可能是什么问题以及如何解决它 首先 脚本 usr bin bash while re
  • 如何在IE中使用border-radius.htc制作圆角

    如何在IE中使用border radius htc制作圆角 我在用边界半径 htc http www htmlremix com css curved corner border radius cross browser修复 IE 中的边框
  • JavaScript 中的 Google Analytics API

    我正在使用 Google Analytics Javascript 库让用户查看他们所在的特定页面的地理地图 然而 每次他们尝试这样做时 您都必须经过身份验证过程才能将我的数据显示在我的页面上 我怎样才能找到替代方案 我只想通过页面上的可视
  • 如何强制keras使用tensorflow GPU后端

    我知道这是最受欢迎的问题之一 但到目前为止 没有一个解决方案对我有用 我正在运行一个用以下语言编写的遗留代码tensorflow v1 13 1 and keras v2 2 4 我无法修改代码来运行最新的张量流版本 由于 keras 现已
  • 如何编译 Programmer Dvorak?

    我正在尝试编译开源项目程序员德沃夏克 http www kaufmann no roland dvorak 问题是它有点旧 并且不能使用当前版本的构建工具进行构建 您可以在我的网站上查看完整的源代码以及我在线所做的修改项目的 Google
  • sqlite alter table 在单个语句中添加多个列

    是否可以在 sqlite 的单个语句中更改表添加多个列 以下内容将不起作用 alter table test add column mycolumn1 text add column mycolumn2 text 不 您必须一次添加一个 请
  • 使用 MS SQL Server 读取包含多个 JSON 对象的文件

    我需要帮助在 MSSQL 中读取 JSON 文件 我有一个像这样的 json 格式 id oid 5c6ceb395916c77f71d9f531 uuid 8337df01 7d98 4cdd b5eb 7fafa88d3740 firs
  • CoreAnimation、AVFoundation 和视频导出功能

    我正在寻找将图片序列导出为 QuickTime 视频的正确方法 我知道 AV Foundation 能够合并或重新组合视频 还能够添加音轨来构建单个视频资产 现在 我的目标有点不同 我想从头开始创建一个视频 我有一组 UIImage 我需要
  • capistrano 部署时使用了错误版本的 Ruby

    在我使用 capistrano 部署到新服务器后 我看到 共享 捆绑 红宝石 1 9 1 gems 我什至没有在服务器上安装 ruby 1 9 1 如果我跑 ruby v它返回 1 9 3 但在所有的 capisrtano 操作中我一直看到
  • Spring、NotReadablePropertyException 和 Glassfish 版本

    我正在开发一个使用 Spring MVC 的 Web 应用程序 它在 Glassfish 3 0 1 上运行良好 但当迁移到 Glassfish 3 1 时 它开始表现得很奇怪 有些页面仅部分显示 或根本不显示任何内容 并且在日志中 有很多