【发布时间】: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