【问题标题】:JSF custom converter fails on unicode stringJSF 自定义转换器在 unicode 字符串上失败
【发布时间】:2014-03-14 09:48:06
【问题描述】:

this answer调整转换器

// @FacesConverter(forClass = Crew.class) // no injection
@ManagedBean
@RequestScoped
public static class CrewConverter implements Converter {

    @EJB
    private CrewService cs;

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object value) {
        return (value instanceof Crew) ? ((Crew) value).getName() : null;
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
        if (value == null) {
            return null;
        }
        System.out.println("value : " + value);
        List<Crew> allCrew = cs.allCrew();
        for (Crew crew : allCrew) {
            if (crew.getName().equals(value)) {
                System.out.println("value found: " + value);
                return crew;
            }
        }
        throw new ConverterException(new FacesMessage(String.format(
            "Cannot convert %s to Crew", value)));
    }
}

在转换器失败的项目之一上:

无法将 ÎανάÏÎ·Ï ÎÎÎ³Î³Î¿Ï 转换为 Crew

对于其余的转换通过(但不是验证,这是另一回事我必须在 Crew 中定义 equals()!)

值显示正确 - 我应该调整转换器还是问题可能更深(在服务器配置中)?

我在 glassfish 4 上

编辑 - 形式:

<h:form id="movie_crew_form"
    rendered="#{movieController.movie  != null}" >
<h:panelGrid columns="2">
    <h:selectOneListbox id="crewMember" redisplay="true" size="8"
        value="#{movieController.crewMember}"
        converter="#{movieController$CrewConverter}">
        <f:selectItems value="#{movieController.allCrew}" var="entry"
            itemValue="#{entry}" itemLabel="#{entry.name}" />
        <f:ajax event="blur" render="crewMemberMessage" />
    </h:selectOneListbox>
    <h:message id="crewMemberMessage" for="crewMember" />
</h:panelGrid>
<h:commandButton value="Add" action="#{movieController.addCrewMember}" />
</h:form>

EDIT2:当我点击“添加”按钮时出现消息 - 当我 alt-tab 退出表单时(因此触发了 onBlur)转换有效!示例输出(在 Eclipse 控制台上)

在 alt 选项卡上:

INFO: value : ??????? ??????
FINE: SELECT IDCREW, NAME FROM CREW
INFO: value found: ??????? ??????
FINE: SELECT IDCREW, NAME FROM CREW
FINE: SELECT IDCREW, NAME FROM CREW

关于“添加”:

INFO: value : ??????? ??????
FINE: SELECT IDCREW, NAME FROM CREW
INFO: value found: ??????? ??????
FINE: SELECT IDCREW, NAME FROM CREW
FINE: SELECT IDCREW, NAME FROM CREW
INFO: value : Î?ανάÏ?ηÏ? Î?έγγοÏ?
FINE: SELECT IDCREW, NAME FROM CREW
FINE: SELECT IDCREW, NAME FROM CREW

有趣的是,当这个 mojibake 显示时,它实际上让我再次按下“添加”按钮,并且方法 addCrewMember() 被调用 导致违反约束(我期望)。

【问题讨论】:

  • 您的问题令人困惑。转换器似乎工作正常。问题的当前状态是什么? Eclipse 无法将 CP1252 / ISO-8859-1 范围之外的字符正确打印到标准输出?
  • @BalusC:不不 - 当我按“添加”时,我看到页面上的消息 Cannot convert ÎανάÏÎ·Ï ÎÎ­Î³Î³Î¿Ï to Crew。我刚刚在 Eclipse 中发布了打印输出 - 当我选择了带有 unicode 字符的名称并在它第一次运行时点击“添加”时它说 value : ??????? ?????? - 没关系(我知道我必须在 Eclipse 中将控制台设置为 UTF-8 ),在浏览器窗口外的 alt 选项卡上执行相同操作 - 第二次显示 value : Î?ανάÏ?ηÏ? Î?έγγοÏ? - 此处无法转换。
  • @BalusC:为什么它会运行两次,谁给它第二次(已经乱码)输入是问题
  • 但是 ?s 被打印的症状表明 Eclipse 根本没有被指示在标准输出中使用 UTF-8。
  • @BalusC: 是的 - 事实证明这并不简单,因为没有设置运行配置。但日食不是问题 - ??? unicode 是否正确读取且显示不佳,但为什么是 Î?ανάÏ?ηÏ? Î?έγγοÏ? ? - 我解决了它(见我的答案),但我不明白为什么 - 这是我错过的生命周期。我会接受答案

标签: jsf jsf-2 unicode converter glassfish-4


【解决方案1】:

将按钮更改为:

<h:commandButton value="Add" action="#{movieController.addCrewMember}">
    <f:ajax execute="@form" render="@form" />
</h:commandButton>

解决了。

【讨论】:

    猜你喜欢
    • 2014-04-20
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多