Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf bean、@Inject和params的CDI生命周期_Jsf_Jsf 2_Seam_Cdi_Jboss Weld - Fatal编程技术网

Jsf bean、@Inject和params的CDI生命周期

Jsf bean、@Inject和params的CDI生命周期,jsf,jsf-2,seam,cdi,jboss-weld,Jsf,Jsf 2,Seam,Cdi,Jboss Weld,视图和bean一直在工作,直到我尝试修复非标准名称,现在我已经断开了两者之间的连接。奇怪的是,“后退”按钮有正确的链接,但内容不显示,也不记录。为什么不执行Detail.getComments()呢 我一直在浏览文档,试图更好地理解@Inject。似乎存在一个我也不理解的生命周期问题。如果不是生命周期,那么我甚至无法推测为什么细节.getComments()从未显示在glassfish日志中: INFO: MessageBean.getModel.. INFO: SingletonNNTP.re

视图和bean一直在工作,直到我尝试修复非标准名称,现在我已经断开了两者之间的连接。奇怪的是,“后退”按钮有正确的链接,但内容不显示,也不记录。为什么不执行Detail.getComments()呢

我一直在浏览文档,试图更好地理解@Inject。似乎存在一个我也不理解的生命周期问题。如果不是生命周期,那么我甚至无法推测为什么细节.getComments()从未显示在glassfish日志中:

INFO: MessageBean.getModel..
INFO: SingletonNNTP.returning messages..
INFO: MessageBean.getModel..
INFO: SingletonNNTP.returning messages..
INFO: MessageBean.getModel..
INFO: SingletonNNTP.returning messages..
INFO: Detail..
INFO: Detail.getId..null
INFO: Detail.getId..SETTING DEFAULT ID
INFO: Detail.onLoad..2000
INFO: Detail.getId..2000
INFO: Detail.getId..2000
INFO: Detail.setId..2000
INFO: Detail.getId..2019
INFO: ..Detail.setId 2019
INFO: Detail.back..
INFO: Detail.getId..2019
INFO: ..Detail.back 2,018
INFO: Detail.getId..2019
值2000是一个默认值,只有当id==null时才会发生,它永远不应该这样做。它应该立即引入该属性。因此,我不确定这是否是范围(我刚刚才发现CDI不支持@SessionScoped)、生命周期或其他方面的问题。也许我需要在那个变量上使用@Inject

视图detail.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
    <body>
        <f:metadata>
            <f:viewParam name="id" id="id" value="#{detail.id}" />
        </f:metadata>
        <ui:composition template="./complexTemplate.xhtml">
            <ui:define name="top">
                <h:link value="back" outcome="detail" includeViewParams="true">
                    <f:param name="id" value="#{detail.back}"/>
                </h:link>
            <ui:define name="content">
                <h:outputText value="#{detail.content}" rendered="false"/>
            </ui:define>
            <ui:define name="bottom">
                bottom
            </ui:define>
        </ui:composition>
    </body>
</html>
根据上面的日志,它似乎从未调用过Detail.getContent(),尽管它是视图的一部分:

在这个细节上很奇怪。content()是在我更改这个类以更好地遵循命名约定之前被调用的。我正在浏览一些JavaEE6文档,但不介意直接阅读一本好的手册。我发现描述这一点的文档总是使用@ManagedBeans,但我不是。正如@Kawu在回答中所描述的,这里似乎有很多陷阱

将@Inject添加到id字段会导致部署错误:

init:
deps-module-jar:
deps-ear-jar:
deps-jar:
library-inclusion-in-archive:
library-inclusion-in-manifest:
compile:
compile-jsps:
In-place deployment at /home/thufir/NetBeansProjects/NNTPjsf/build/web
Initializing...
deploy?DEFAULT=/home/thufir/NetBeansProjects/NNTPjsf/build/web&name=NNTPjsf&contextroot=/NNTPjsf&force=true failed on GlassFish Server 3.1.2 
 Error occurred during deployment: Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [String] with qualifiers [@Default] at injection point [[field] @Inject private net.bounceme.dur.nntp.Detail.id]. Please see server.log for more details.
/home/thufir/NetBeansProjects/NNTPjsf/nbproject/build-impl.xml:749: The module has not been deployed.
See the server log for details.
BUILD FAILED (total time: 9 seconds)

当然,注入字符串不是问题,可能是一个问题。

我理解您的沮丧,我发现问题更多的是您的设置/总体理解。但是,仍然很难找到真正的问题来回答,也许下次你可以试着把你的问题分开

以下是一些答案:

为什么不执行Detail.getComments()呢

嗯,也许是因为它不在豆子里?我猜您是在重新引用
detail.getContent

根据上面的日志,似乎从来没有, 调用Detail.getContent(),尽管它是视图的一部分:

尝试
rendered=true
:-)

你在getter中加入了很多逻辑。尝试使用字段而不是getter调试

值2000是一个默认值,只有当id==null时才会发生,它永远不应该这样做

它看起来像
私有字符串id=null
是id为空的完美解释

请记住,像JSF、CDI和JavaEE这样的现代框架在幕后使用反射、代理和拦截器做了大量的工作。例如,不要依赖于对何时(以及多久)调用构造函数的经典理解

再次,考虑将初始化逻辑移离吸气剂。@后构造将是JavaEE规范的创始人为它选择的地方

老实说:没有什么看起来非常错误,但是您的代码有点凌乱,并且非常难以理解和遵循

尝试删除所有像这样的间接

int b = Integer.parseInt(getId());
。。。一切看起来都会好得多

哦,你为什么要为整个类声明一个固定的日志级别呢?试试这样的

private static final Logger LOG = Logger.getLogger(Some.class);
...
LOG.info("...");

希望这能给你一个开始。请随意发布进一步的问题,最好是简短一点,回答单个、孤立的方面。

我理解您的沮丧,我发现问题更多的是您的设置/总体理解。但是,仍然很难找到真正的问题来回答,也许下次你可以试着把你的问题分开

以下是一些答案:

为什么不执行Detail.getComments()呢

嗯,也许是因为它不在豆子里?我猜您是在重新引用
detail.getContent

根据上面的日志,似乎从来没有, 调用Detail.getContent(),尽管它是视图的一部分:

尝试
rendered=true
:-)

你在getter中加入了很多逻辑。尝试使用字段而不是getter调试

值2000是一个默认值,只有当id==null时才会发生,它永远不应该这样做

它看起来像
私有字符串id=null
是id为空的完美解释

请记住,像JSF、CDI和JavaEE这样的现代框架在幕后使用反射、代理和拦截器做了大量的工作。例如,不要依赖于对何时(以及多久)调用构造函数的经典理解

再次,考虑将初始化逻辑移离吸气剂。@后构造将是JavaEE规范的创始人为它选择的地方

老实说:没有什么看起来非常错误,但是您的代码有点凌乱,并且非常难以理解和遵循

尝试删除所有像这样的间接

int b = Integer.parseInt(getId());
。。。一切看起来都会好得多

哦,你为什么要为整个类声明一个固定的日志级别呢?试试这样的

private static final Logger LOG = Logger.getLogger(Some.class);
...
LOG.info("...");

希望这能给你一个开始。请随意发布进一步的问题,最好是简短一点,并且回答单个、孤立的方面。

“我刚刚发现CDI不支持
@SessionScoped
”-这是不正确的。CDI没有
@ViewScoped
,但它有
@SessionScoped
。我建议停止你现在所做的一切,先从上到下阅读一本像样的JSF书籍/教程。例如,“核心JSF”、“完整参考”、“开始Java EE 6”等等。你现在毫无头绪地到处跑,而你根本没有学会爬行/行走。“我刚刚才发现CDI不支持
@SessionScoped
”——这是不正确的。CDI没有
@ViewScoped
,但它有
@SessionScoped