Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 带有<;f:viewParam>;和来自CDI的Faces转换器_Jsf_Glassfish_Facelets_El_Cdi - Fatal编程技术网

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
}