java - 简单博客中的 JSf 请求范围

标签 java jsf-2 scope

我正在尝试使用 jsf 2.0 创建简单的博客。它包含 2 个类:

BlogManager(在 session 范围内) 博客(在请求范围内)

@Named("blogManager")
@SessionScoped
public class BlogManager {
    private List<Blog> blogs;

    @ManagedProperty(value = "#{blog}")
    Blog blog;

    public BlogManager() {
        blogs = new ArrayList<Blog>();
    }

    public List<Blog> getBlogs() {
        return blogs;
    }

    public void setBlogs(List<Blog> blogs) {
        this.blogs = blogs;
    }

    public Blog getBlog() {
        return blog;
    }

    public void setBlog(Blog blog) {
        this.blog = blog;
    }

    public void addBlog() {
        blogs.add(blog);
    }

    public void removeBlog(Blog blog) {
        blogs.add(blog);
    }
}

博客类:

@Named("blog")
@RequestScoped
public class Blog {

    private Integer id;

    private String title;
    private String text;
    private Date date;

    public Blog() {
        id = (int) System.currentTimeMillis();
    }

    private Integer readed;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Integer getReaded() {
        return readed;
    }

    public void setReaded(Integer readed) {
        this.readed = readed;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

}

然后在我的 xhtml 表单中我正在写这个东西:

<h:form>
            <fieldset>
                <legend>Blog</legend>
                <p>
                    Title:
                    <h:inputText value="#{blog.title}" />
                </p>
                <p>
                    Text:
                    <h:inputTextarea value="#{blog.text}" />
                </p>
                <p>
                    <h:commandButton action="#{blogManager.addBlog}" />
                </p>
            </fieldset>
        </h:form>

当我点击提交时,它说博客目标无法访问。这是请求范围。我在想,一旦 jsf 找不到博客对象,它就会创建用户输入并将其分配给博客对象。然后我就可以在blogManager中看到它了。但这不起作用。我应该为博客类使用什么范围?我可以在 blogManager 中注入(inject)请求范围吗?

谢谢

最佳答案

您正在混合 JSF 和 CDI 注释。您已通过 CDI 的 @Named 管理您的 Bean,但您仍尝试使用 JSF 特定的 @ManagedProperty 注释将一个 CDI 托管 Bean 注入(inject)到另一个 CDI 托管 Bean 中。这是行不通的。您需要使用 CDI 自己的 @Inject 注释来代替。 @ManagedProperty 仅适用于 JSF @ManagedBean 类。

相应地修复它:

@Inject
private Blog blog;

此外,您还需要绝对确保当您通过 CDI 的 @Named 管理 Bean 时,所有像 @SessionScoped 这样的范围注释都来自 javax.enterprise.context 包,而不是来自 javax.faces.bean 包。

<小时/>

与具体问题无关,这个设计是有缺陷的。 Blog 类不应该是托管 bean,而应该是 @Entity 并且只是 BlogManager 类的普通属性。

关于java - 简单博客中的 JSf 请求范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9614190/

相关文章:

java - 服务器重置新连接,但 cpu/网络负载较低

Java 正则表达式 : UNGREEDY flag

java - 使用正则表达式仅获取分隔符

java - JSF 2 上的 HTTPS,用于 protected 资源和登录

java - 使用 beans.xml 文件进行 CDI bean 配置

c++ - 为什么数组到指针的输出不相关

Java 类型参数不在其范围内

jsf - 发生验证错误时突出显示 JSF 中的 inputText

r - 自定义环境中的范围(功能)

.net - 如何在表单中创建可供多种方法使用的对象