gpt4 book ai didi

do not localize to , 但到默认语言环境的验证/转换错误

转载 作者:行者123 更新时间:2023-12-04 12:09:07 26 4
gpt4 key购买 nike

我有一个 <f:viewParam> JSF 页面上的标记,用于在转换和验证后将 GET 参数设置为相应的托管 bean。

如果发生转换或验证错误,则会从资源包中获取适当的错误消息并显示在 <p:messages> 上。 (也可以是 <p:growl><h:messages> )。

该应用程序是多语言的。 Therefore when a different language is selected, a message should be displayed in that language but it always displays the message according to the default locale en (英语)。

测试.xhtml:

<!DOCTYPE html>
<html lang="#{localeBean.language}"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">

<f:view locale="#{localeBean.locale}">
<f:metadata>
<f:viewParam name="id" converter="#{myConverter}" />
</f:metadata>
<h:head>
<title>Test</title>
</h:head>
<h:body>
<h:messages />
</h:body>
</f:view>
</html>

转换器:
@FacesConverter("myConverter")
public final class MyConverter implements Converter
{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
ResourceBundle bundle = context.getApplication()
.evaluateExpressionGet(context, "#{messages}", ResourceBundle.class);
String message = bundle.getString("id.conversion.error");
throw new ConverterException(
new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value)
{
throw new UnsupportedOperationException(); // Not relevant in this problem.
}
}

除了来自 <f:viewParam> 的消息, 没有问题。所有其他类型的消息都以用户选择的语言显示。
<f:viewParam>有什么特别的吗? ?

最佳答案

我可以重现你的问题。 Mojarra 2.1.25 和 MyFaces 2.1.12 都暴露了同样的问题。因此,我不确定这是 JSF impl 中的错误还是 JSF 规范中的疏忽。到目前为止,事实证明在进入渲染响应阶段之前没有为 GET 请求设置 viewroot 语言环境。转换器在验证阶段运行,远在渲染响应之前,这解释了为什么它使用默认语言环境。稍后我必须对其进行调查,并在必要时向 Mojarra 报告问题。

同时,解决这个问题的最好办法是按如下方式获得包,而不是对 <resource-bundle><var> 进行 EL 评估。 :

String basename = "com.example.i18n.message"; // Exactly the same as <resource-bundle><base-name>
Locale locale = context.getApplication().evaluateExpressionGet(context, "#{localeBean.locale}", Locale.class);
ResourceBundle bundle = ResourceBundle.getBundle(basename, locale);
// ...

更新 : 我已举报 issue 3021根据这个问题。我仍然无法理解规范在这一点上所说的内容,但我发现实现的行为不直观。

更新 2 :Mojarra 和 MyFaces 的人同意这一点。对于 Mojarra,它是 fixed按照 2.2.5(还没有 2.1.x 向后移植?)对于 MyFaces,它是 fixed根据 2.0.19、2.1.13 和 2.2.0。

关于<f :viewParam> do not localize to <f:view locale>, 但到默认语言环境的验证/转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18495673/

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