Мне непонятно, почему я получаю это особое исключение, это, как мне кажется, красношерстная. Основная проблема может быть связана с последней строкой исключения: MessageConverter.getAsObject..0
, которая должна быть на самом деле равна 1501 (идентификатор сообщения). Итак, почему MessageConverter.getAsObject имеет неправильный идентификатор?с <f:viewParam> и FacesConverter от CDI
Я думаю, что это может быть связано с конструктором Detail, который, вероятно, передает неправильные параметры 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>
GlassFish показывает:
INFO: MessageConverter.getAsObject..1501
INFO: SingletonNNTP.forward..11
WARNING: 1501
java.lang.ArrayIndexOutOfBoundsException: 1501
at java.util.Arrays$ArrayList.get(Arrays.java:2866)
at net.bounceme.dur.nntp.SingletonNNTP.getMessage(SingletonNNTP.java:86)
at net.bounceme.dur.nntp.MessageConverter.getAsObject(MessageConverter.java:21)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:171)
at javax.faces.component.UIViewParameter.getConvertedValue(UIViewParameter.java:394)
at javax.faces.component.UIInput.validate(UIInput.java:960)
at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
at javax.faces.component.UIInput.processValidators(UIInput.java:698)
at javax.faces.component.UIViewParameter.processValidators(UIViewParameter.java:273)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172)
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:722)
INFO: MessageConverter.getAsObject..0
INFO: SingletonNNTP.forward..11
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();
}
}
ссылка:
viewparam-vs-managedpropertyvalue-param-id, не совсем, кажется, применяются, как я использую CDI, @Named, и поэтому не может использовать @ManagedProperty, который является «реальной» проблема. Я полагаю, что я не вижу преимущества CDI, поскольку @ManagedProperty выглядит очень красиво.
ProcessingGETRequestParameters имеет, пожалуй, ключевой пункт:
Да, это @ManagedBean вместо @FacesConverter! Как неудобно, но невозможно ввести @EJB внутри @FacesConverter в порядке , чтобы выполнить работу по взаимодействию с БД. Эта же проблема проявляется, когда вы используете CDI @Inject для ввода свойства, вам нужно будет использовать @Named вместо @FacesConverter. Ребята из Java EE/JSF/CDI работают над тем, что для будущей версии JSF 2.2 для версиисм. Также спецификацию JSF-спецификации 763. Если вам действительно нужно , это должен быть @FacesConverter (для использования атрибута forClass, например), тогда вы всегда можете вручную захватить EJB от JNDI. См. Также следующую главу.
который, для моих целей, возможно, немного не по теме, поскольку это связано с EJB. Однако, возможно, это точная трудность, с которой я сталкиваюсь?
[ссылка] (http://stackoverflow.com/questions/10058852/inject-to-pass-params-to-a-cdi-named-bean-via-url-gives-jboss-error- на-netbean/10087664 # 10087664) для ответа на основной вопрос. Пожалуйста, удалите этот вопрос. – Thufir