【问题标题】:JSF - Bean injection troubleJSF - Bean 注入问题
【发布时间】:2026-02-19 16:10:01
【问题描述】:

正如用户前段时间在另一个问题中所建议的那样,我需要在另一个 bean 中注入一个 bean。

所以,我做了以下事情:

@ManagedBean
@RequestScoped
public class Articles {
    private String selectedMenu;

    @ManagedProperty(value="#{user}")
    private UserManager user;

    @PostConstruct
    public void init() {
        if(selectedMenu==null || selectedMenu.trim().isEmpty()) {
            this.selectedMenu="0";
        }
    }

    // now here i should access to user.methods

    // getter and setter
}

事实上,我无法访问 UserManager 数据。我收到这些错误:

浏览器 malformedXML: INVALID_STATE_ERR: Dom Exception 11

服务器日志 30-nov-2010 15.36.58 javax.faces.component.UIViewRoot$ViewMap put AVVERTENZA: Setting non-serializable attribute value into ViewMap: (key: profileSelector, value class: model.ProfileSelector) 30-nov-2010 15.36.59 com.sun.faces.mgbean.BeanManager preProcessBean GRAVE: JSF will be unable to create managed bean articles when it is requested. The following problems where found: - Property user for managed bean articles does not exist. Check that appropriate getter and/or setter methods exist. 30-nov-2010 15.36.59 com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback visit GRAVE: com.sun.faces.mgbean.ManagedBeanCreationException: Unable to create managed bean articles. The following problems were found: - Property user for managed bean articles does not exist. Check that appropriate getter and/or setter methods exist.

如果我评论 @ManagedProperty(value="#{user}")private UserManager user; 比我看不到任何错误。所以这就是问题所在。我错了什么?

干杯

【问题讨论】:

  • 你在哪里看到这个错误?
  • 当我尝试访问这个 bean 时看到了这个错误!
  • @org 的意思是 where,而不是 when。 IE。在服务器日志中,或者在网络浏览器中,或者在天空中,等等
  • + 发布完整的错误消息
  • 哈哈in the sky 摇滚!!我在主题中发布了错误详细信息:) 谢谢大家

标签: java jsf jsf-2 facelets postconstruct


【解决方案1】:

malformedXML:INVALID_STATE_ERR:Dom 异常 11

此 XML 错误表示您的视图(XHTML)中的错误,而不是 bean 中的错误。我不明白为什么会发生此错误,但可能您有一个非常复杂的组件树,其中有几个 rendered 属性,其中一个取决于 user 属性,这导致客户端 XML 树中的状态错误.

关于服务器日志:

AVVERTENZA:在 ViewMap 中设置 non-serializable 属性值:(键:profileSelector,值 class:model.ProfileSelector

这不一定有害,但要修复它,你需要让类实现java.io.Serializable

public class ProfileSelector implements Serializable {}

这样,服务器将能够在必要时通过网络传输实例和/或将实例存储在硬盘而不是内存中(当服务器重新启动或放置在服务器集群中时)。


30-nov-2010 15.36.59 com.sun.faces.mgbean.BeanManager preProcessBean GRAVE:JSF 在请求时将无法创建托管 bean 文章。发现以下问题: - 托管 bean 文章的属性用户不存在。检查是否存在适当的 getter 和/或 setter 方法

这也是不言自明的。确保名称为 articles 的托管 bean 的属性 user 有正确的 getter/setter 方法。

@ManagedBean
@RequestScoped
public class Articles {

    @ManagedProperty(value="#{user}")
    private UserManager user;

    public UserManager getUser() {
        return user;
    }

    public void setUser(UserManager user) {
        this.user = user;
    }

}

如有必要,您可以让您的 IDE 自动生成它们。在 Eclipse 中,检查右键单击上下文菜单 (Alt+Shift+S) 中的 Source 部分。


30-nov-2010 15.36.59 com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback 访问 GRAVE:com.sun.faces.mgbean.ManagedBeanCreationException:无法创建托管 bean 文章。发现以下问题: - 托管 bean 文章的属性用户不存在。检查是否存在适当的 getter 和/或 setter 方法

这有同样的问题原因。

【讨论】:

  • 因此,inject 属性调用了一个 getter/setter。我的意思是“写下 bean 实例的名称”。
  • 我解决了其中两个问题。最后一次仍然发生 (com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback)
  • 如果您确定添加了正确的 getter/setter 方法,则重新构建、重新部署并重新启动。
  • 我已经做到了。我将正确的 getter/setter 添加到 UserManager bean(并且,在 postcostruct 上,我写了 this.user=this,因为它需要在返回时通过 getter 识别用户实例),但我收到第三条错误消息。另外,现在(通过添加implements Serializable)我得到了一些其他错误,比如Cannot serialize session attribute com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap for session 4B49A9591CAC0968C79EE88BD303533A java.io.NotSerializableException: model.ProfileSelector
  • 嗯? this.user = this?这应该会导致编译错误。您是否将 getter/setter 添加到 Articles 类?