我在 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 不为 null,但在 c:if
行的测试中 service 为 null。
这是整个片段
<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>
这就是我得到的 - 看没有链接:
最佳答案
两条语句可能一行接一行,但不会同时执行。 <c:if>
是一个 JSTL 标签,在 View 构建期间执行。另一个表达式将被包裹在 <h:outputText>
中。它将在 View 渲染期间执行。我猜该服务将在两者之间创建。
要解决您的问题,您可以替换 <c:if>
与
<ui:fragment rendered="#{serviceUiDescriptions.isLinkInDescriptionForCheckbox(service)}">
或替换 <span>
带有
<h:panelGroup styleClass="smallText" rendered="#{serviceUiDescriptions.isLinkInDescriptionForCheckbox(service)}">
(没有 <c:if>
)。
另请参阅:
关于java - 为什么这次调用中的服务为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23526078/