Jsf 带有<;f:viewParam>;和来自CDI的Faces转换器
我不清楚为什么我会得到这个特殊的例外,我认为这是一个危险的信号。潜在问题可能与异常的最后一行有关:Jsf 带有<;f:viewParam>;和来自CDI的Faces转换器,jsf,glassfish,facelets,el,cdi,Jsf,Glassfish,Facelets,El,Cdi,我不清楚为什么我会得到这个特殊的例外,我认为这是一个危险的信号。潜在问题可能与异常的最后一行有关:MessageConverter.getAsObject..0,它实际上应该是1501(消息ID)。那么,为什么MessageConverter.getAsObject的id不正确 我认为这可能与细节构造函数有关,该构造函数可能向MessageConvert.getAsObject()传递了错误的参数,特别是UIComponent对象——可能需要实例化该引用 相关EL: <h:
MessageConverter.getAsObject..0
,它实际上应该是1501(消息ID)。那么,为什么MessageConverter.getAsObject的id不正确
我认为这可能与细节构造函数有关,该构造函数可能向MessageConvert.getAsObject()传递了错误的参数,特别是UIComponent对象——可能需要实例化该引用
相关EL:
<h:outputLink id="link1" value="detail.xhtml">
<f:param name="id" value="#{m.getMessageNumber()}" />
<h:outputText value="#{m.getMessageNumber()}" />
</h:outputLink>
MessageConverter,到目前为止,我认为这个类还可以:
package net.bounceme.dur.nntp;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.mail.Message;
@FacesConverter("messageConverter")
public class MessageConverter implements Converter {
private static final Logger logger = Logger.getLogger(MessageConverter.class.getName());
private static final Level level = Level.INFO;
private SingletonNNTP nntp = SingletonNNTP.INSTANCE;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
logger.log(level, "MessageConverter.getAsObject..{0}", value);
Message message = nntp.getMessage(Integer.parseInt(value));
return message;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
Message message = (Message) value;
return String.valueOf(message.getMessageNumber());
}
}
这是一个问题类,详细信息,尤其是构造函数是可疑的:
package net.bounceme.dur.nntp;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.mail.Message;
@Named
public class Detail {
private static final Logger logger = Logger.getLogger(Detail.class.getName());
private static final Level level = Level.INFO;
private int id = 0;
private Message message = null;
private SingletonNNTP nntp = SingletonNNTP.INSTANCE;
public Detail() {
MessageConverter mc = new MessageConverter();
FacesContext fc = FacesContext.getCurrentInstance();
String value = String.valueOf(id);
UIComponent ui = null;
Object obj = mc.getAsObject(fc, ui, value);
message = (Message) obj;
}
public int forward() {
logger.log(level, "Detail.forward..{0}", id);
id = id + 1;
logger.log(level, "..Detail.forward {0}", id);
return id;
}
public int back() {
logger.log(level, "Detail.back..{0}", id);
id = id - 1;
logger.log(level, "..Detail.back {0}", id);
return id;
}
public Message getMessage() {
return message;
}
public String getContent() throws Exception {
return message.getContent().toString();
}
}
参考:
这似乎不太适用,因为我使用的是CDI、@Named,因此无法使用@ManagedProperty,这是“真正”的问题。我想我没有看到CDI的好处,因为@ManagedProperty看起来很不错
可能有一个关键段落:
是的,它是@ManagedBean而不是@facescoverter!多么尴尬,但是
在@FacesConverter中按顺序注入@EJB是不可能的
执行数据库交互工作。当您使用
CDI@Inject要注入属性,需要使用@Named
@FacesConverter的。javaee/JSF/CDI的人正在为此而努力
未来的JSF2.2版本,另请参见JSF规范第763期。如果你真的
需要将其设置为@FacesConverter(以便利用
例如,forClass属性),则始终可以手动获取
来自JNDI的EJB。另见下一章
就我而言,这可能有点离题,因为它与EJB相关。然而,也许这正是我遇到的困难?转换器应该在
中使用
<f:viewParam name="id" value="#{detail.message}" converter="messageConverter" />
转换器应在
中使用
<f:viewParam name="id" value="#{detail.message}" converter="messageConverter" />
寻找根本问题的答案。请删除此问题。寻找根本问题的答案。请删除这个问题。好的,我更了解这个答案。我仍然不明白转换器的东西,但是,我仍然在寻找一个解释,我可以理解。我所做的是省略了关于转换器的部分,只是使用了默认的(生成的?)转换器。我放弃了那门课。好吧,我更明白这个答案。我仍然不明白转换器的东西,但是,我仍然在寻找一个解释,我可以理解。我所做的是省略了关于转换器的部分,只是使用了默认的(生成的?)转换器。我放弃了那门课。
@Named
public class Detail {
private Message message;
// Getters+setters+actions
}