java glassfish_java – Spring,NotReadablePropertyException和Glassfish版本
我正在使用一个使用
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.(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-method(通过构造函数获取其值).但就像我说的那样,使用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",});
}
SomethingContainer:
@Embedded
private final Something something = new Something();
public Something getSomething() {
return something;
}
//no setter
public String getDescription() {
return something.getDescription();
}
更新:
重启Glassfish实际上可以暂时解决问题.我怀疑它可能与自定义绑定器的加载有关,我们遇到了一些内存错误的问题,我认为这与它有关,但是已经修复但没有解决这个问题.
更新2:
在3.0.1服务器上,其中一个jvm参数是-client.在3.1服务器上,它是-server.我们将它更改为-client,这使得错误的频率下降了很多,它每隔一天发生一次-server,花了2周的时间才发生-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-classes中.
(另外,错误的字段是“someobject.something [0] .somethingelse [0]”类型,但是当somethingelse-list为空时,没有错误!对我来说,这意味着它某种程度上不能找到列表的get方法(?))
更新6:
似乎问题与从jsps生成Java类有关.我们在部署时没有使用预编译jsps,因此在首次使用时会对它们进行编译.第一次访问页面时,会出现问题,并且编译了jsp.我也注意到,一旦出现问题,之后编译的jsps都会出错.我保留了一些问题生成的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)-line上放了一个断点,并尝试通过调试器运行它:
classCache.put(beanClass,null);
当允许方法完成并重建CachedIntrospectionResults时,事情又开始起作用了.因此,如果允许重建它,那么存储在classCache中的内容与将要创建的内容不同步.这是否是由于第一次构建时出现问题,或者如果classCache在我当前不知道的线路上的某个地方被破坏了.
我开始怀疑这与类加载器有关,因为我之前遇到的问题是由于更新Glassfish时类加载器的工作方式发生了变化.
java glassfish_java – Spring,NotReadablePropertyException和Glassfish版本相关推荐
- java glassfish_java - Tomcat,JBoss和Glassfish有什么区别?
java - Tomcat,JBoss和Glassfish有什么区别? 我开始研究Enterprise Java,我所关注的那本书提到它将使用JBoss. Netbeans随Glassfish一起发货 ...
- java mvc 小程序_[Java教程]Spring MVC 的环境搭建和入门小程序
[Java教程]Spring MVC 的环境搭建和入门小程序 0 2017-02-17 00:00:16 1.1.下载spring框架包. 1.1.1百度搜索Spring Framework. 进入s ...
- 意料之外,情理之中,Spring.NET 3.0 版本发布-
意料之外,情理之中,Spring.NET 3.0 版本发布- 备受社区和企业开发者广泛关注的Spring.NET在上周发布了3.0版本,并且目前已经保持着持续的更新,让我们一起来看一看他究竟发布了哪些 ...
- 使用Java和Spring构建现代Web应用程序
使用Spring Framework创建Java Web应用程序从未如此简单. 如果您已经熟悉Java并且几乎没有创建Web应用程序的经验,或者如果您担心所有很酷的孩子都放弃Java取而代之的是Rub ...
- Spring Boot 2.3 版本变化[翻译]
大家好,我是烤鸭: 最近在把低版本的springboot项目升级,正好翻译了下springboot 2.1-2.3 版本的更新日志. Github 原文:https://github.com/ ...
- 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)
这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 一.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案, ...
- SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)
转载请标明出处: http://blog.csdn.net/forezp/article/details/81041078 本文出自方志朋的博客 这篇文章主要讲述服务追踪组件zipkin,Spri ...
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)
转载请标明出处: http://blog.csdn.net/forezp/article/details/81041078 本文出自方志朋的博客 个人博客纯净版:https://www.fangzhi ...
- 精选10个用于Java开发Spring Boot的Eclipse插件
前言 作为从事Java多年的程序员,在此分享用于 Java 和 Spring Boot 开发的 10 大 Eclipse插件: 1. EGit - Eclipse 的 Git 集成 这可能是当今 Ja ...
最新文章
- linux中cut -c命令,linux中~/cut/argus/
- URL 路径长度限制(错误:指定的文件或文件夹名称太长)
- php delete和truncate,TRUNCATE 删除表,无法回退。默认选择为整个表的内容,所以不能加条件。...
- Kafka的精髓全写这本“限量笔记”里了
- 最优化学习笔记(六)——牛顿法性质分析
- 海神祭司被机器人拉出来_全联盟最不怕机器人钩子的四个英雄,最后一个巴不得被钩中...
- stm32 vscode 编译_STM32开发之 VSCode+gcc环境编译
- linux box 信息发布,使用Instantbox快速搭建一个开箱即用的Web端临时Linux系统
- php ldap ad 登录验证,PHP中的LDAP身份验证 – 无需密码即可进行身份验证
- 斐波那契数列。古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问每个月的兔子总数为多少?
- 代码整洁 vs 代码肮脏
- 从python开始学编程mobi_Python编程快速上手[azw3+epub+mobi][13.99MB]
- oracle中imp命令详解,Oracle使用imp命令导入数据详解
- 普中科技单片机AD电压数模转换。STC89C52和XPT2046 芯片
- ESXi社区版ne1000 VIB驱动的更新
- 新一代打包神器parcel简介
- IBM服务器修改时间为24小时制,联想携IBM为用户提供24小时全天候技术支持
- mybatis学习:二、 Mybatis的Dao开发、mybatis-config.xml文件的详情
- 数据结构(二)----线性表(List)链式存储结构(1)
- java jms activemq_JMS-ActiveMQ与Java消息服务