gpt4 book ai didi

JSF2 复合组件为 action 方法抛出 PropertyNotFoundException

转载 作者:行者123 更新时间:2023-12-04 22:51:59 25 4
gpt4 key购买 nike

我有一个复合组件:

<composite:interface>
<composite:attribute name="actionMethod"
method-signature="java.lang.String action()" required="true" />
</composite:interface>

<composite:implementation>
<h:form>
<h:commandButton id="captureButton" value="#{msgs.capture}"
action="#{cc.attrs.actionMethod}" />
</h:form>
</composite:implementation>

以及调用该复合组件的页面:
<ezcomp:captureTitle actionMethod="#{saveDecisionsBean.captureTitle}" />

和一个包含 Action 的 bean:
@Named(value="saveDecisionsBean")
@SessionScoped
public class SaveDecisionsBean extends BackingBeanBase {
...
public String captureTitle() {
...
}
}

现在这是我的问题。当我尝试运行它时,它说 SaveDecisionsBean 没有属性 captureTitle。因此,我必须添加一个 SaveDecisionsBean#getCaptureTitle()方法。当我这样做时,它运行得很好。为什么我必须定义这个方法?它在 <composite:attribute /> 中说它是一个方法,它被用作一个 Action 。

这是我收到的确切错误消息:

javax.el.PropertyNotFoundException: /index.xhtml @54,86 
actionMethod="#{saveDecisionsBean.captureTitle}":
The class 'com.example.persistence.SaveDecisionsBean_$$_javassist_209'
does not have the property 'captureTitle'.

(出于 SEO 原因:其他实现可能会显示类名 WeldClientProxy 。)

最佳答案

我遇到了同样的问题,我发现这是由于我的操作方法确实抛出了 IllegalArgumentException。同时,这已被报告为错误: Composite action method throws PropertyNotFoundException when method throws any exception .

棘手的部分(至少对我而言)是我的应用程序一直运行良好,直到我将部分代码移动到复合组件 (CC) 中。在我的应用程序捕获 IAE 并显示一个很好的错误消息之前,但是在使用 CC 时,JSF 验证(或其他任何……)首先捕获它并产生这个相当困惑的错误消息。

我通过使用 BalusC 提供的测试代码的修改版本验证了这一点(见下文)。测试页面显示了两个输入和提交按钮组件。如果您在文本字段中输入某些内容(除了“panic”(不带引号)),CC 版本和“内联”版本都有效(观看标准输出)。如果您在“内联”版本中输入“panic”,您会按预期注意到 IAE,但如果您在上面的“CC-version”中输入相同的内容,您将看到 PropertyNotFoundException。似乎 JSF 被 IAE 弄糊涂了,并决定该属性必须是一个属性,而不是一个操作方法……不知道这是一个错误还是一个功能。这是根据规范,有人知道吗?

所以,这里的结论是你不能在 CC 中使用 Action 方法和抛出异常的 bean。对我来说,这意味着我不能使用复合组件。伤心!

希望这可以帮助...

/resources/components/test.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
<cc:attribute name="text"/>
<cc:attribute name="action" method-signature="java.lang.String action()" required="true" />
</cc:interface>
<cc:implementation>
<h:form>
<h:inputText value="#{cc.attrs.text}"/>
<h:commandButton value="submit" action="#{cc.attrs.action}" />
</h:form>
</cc:implementation>


/test.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite/components">
<h:head>
<title>Test</title>
</h:head>
<h:body>
<!-- text and cmd-button as cc -->
<cc:test text="#{bean.text}" action="#{bean.submit}" />

<hr/>

<!-- text and cmd-buuton inline -->
<h:form id="inline">
<h:inputText value="#{bean.text}"/>
<h:commandButton value="submit2" action="#{bean.submit}" />
</h:form>
</h:body>
</html>

最后是 Bean:
@ManagedBean
@RequestScoped
public class Bean {

private String text;

public String getText() {
return text;
}

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

public String submit() {
if (text.equalsIgnoreCase("panic")){
throw new IllegalArgumentException("Panic!");
}

System.out.println(text);

return null;
}
}

关于JSF2 复合组件为 action 方法抛出 PropertyNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3487489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com