【问题标题】:Why is service null in this call?为什么此调用中的服务为空?
【发布时间】:2014-05-07 18:58:16
【问题描述】:

我在一个 bean 上有这个方法:

public boolean isLinkInDescriptionForCheckbox(final Service service) {
    logger.info("Testing if there is a link for {}", service);
    return Service.UK_ADDRESS_CORRECTION == service;
}

...这在我的 JSP 中:

<c:if test="#{serviceUiDescriptions.isLinkInDescriptionForCheckbox(service)}">

我的日志告诉我:

c.n.c.s.c.ServiceUiDescriptions - Testing if there is a link for null

而且还可以正常工作:

<label for="checkbox_#{service.name()}"> #{serviceUiDescriptions.getDescriptionForCheckbox(service)}</label>

...这是c:if 标记之前的行

所以:在前面的行中,service 不为空,但在c:if 行的测试中,service 为空。

这是整个片段

<ui:repeat var="service" value="#{servicesBean.getAvailableServicesOfGroup(servicePresentationGroup)}">
    <div class="servicePresentation" title="#{serviceUiDescriptions.getLongDescription(service)}">
        <span class="checkboxSpan"> 
            <input type="checkbox” name="checkbox_#{service.name()}" value="true" checked="checked"
                                    id="checkbox_#{service.name()}" />
        </span>
            <h2>
                <label for="checkbox_#{service.name()}"> #{serviceUiDescriptions.getDescriptionForCheckbox(service)}</label>
                <c:if test="#{serviceUiDescriptions.isLinkInDescriptionForCheckbox(service)}">
                    <span class="smallText">
                        <h:outputLink value="#{serviceUiDescriptions.getLinkInDescriptionForCheckbox(service)}" >
                        #{serviceUiDescriptions.getLinkDescriptionInDescriptionForCheckbox(service)}
                        </h:outputLink>
                    </span>
                </c:if>
            </h2>
        </div>
</ui:repeat>

这是我得到的 - 看没有链接:

【问题讨论】:

  • 你的 JSP 中哪里定义了服务?
  • 添加了整个片段
  • servicesBean.getAvailableServicesOfGroup(servicePresentationGroup) 是否为空? JSP 的表达式语言是"null friendly",所以即使service 为null,service.name() 也不会引发异常,但是一旦将某些内容传回Java 领域,就需要小心取消对null 的引用。
  • 对于我来说,这看起来像 JSF。如果是 JSF,请考虑立即评估测试条件 ('test="${blah') 而不是延迟(不确定这是正确的术语)'test="#{blah'。
  • @DwB 抱歉,改成 $ 效果不好

标签: java jsf


【解决方案1】:

两个语句可能是一行接一个,但它们不会同时执行。 &lt;c:if&gt; 是在视图构建期间执行的 JSTL 标记。另一个表达式将包装在 &lt;h:outputText&gt; 中,它将在视图渲染期间执行。而且我猜该服务将在两者之间创建。

要解决您的问题,您可以将 &lt;c:if&gt; 替换为

<ui:fragment rendered="#{serviceUiDescriptions.isLinkInDescriptionForCheckbox(service)}">

或将&lt;span&gt; 元素替换为

<h:panelGroup styleClass="smallText" rendered="#{serviceUiDescriptions.isLinkInDescriptionForCheckbox(service)}">

(没有&lt;c:if&gt;)。

另见:

【讨论】:

  • 经过测试。作品。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-01-09
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 2016-01-05
  • 1970-01-01
  • 2012-10-06
相关资源
最近更新 更多