2012-04-08 2 views
0

Мне непонятно, почему я получаю это особое исключение, это, как мне кажется, красношерстная. Основная проблема может быть связана с последней строкой исключения: 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. Однако, возможно, это точная трудность, с которой я сталкиваюсь?

+0

[ссылка] (http://stackoverflow.com/questions/10058852/inject-to-pass-params-to-a-cdi-named-bean-via-url-gives-jboss-error- на-netbean/10087664 # 10087664) для ответа на основной вопрос. Пожалуйста, удалите этот вопрос. – Thufir

ответ

4

Конвертер предполагается использовать в <f:viewParam>.

<f:viewParam name="id" value="#{detail.message}" converter="messageConverter" /> 

Это будет в основном преобразовать параметр запроса id на объект Message, а затем установить его в собственность за #{detail.message}. Вы должны предоставить только набор для него в классе Detail, я не вижу никого в вашем компоненте.

Вы не должны выполнять задание преобразования в конструкторе класса Detail. У вас должно быть только имущество Message, а не id или nntp. Удалите весь конструктор.

@Named 
public class Detail { 

    private Message message; 

    // Getters+setters+actions 
} 
+0

ОК, я понимаю этот ответ лучше. Тем не менее, я до сих пор не понимаю, что такое конвертер, и я все еще ищу объяснения, которые я могу понять. То, что я сделал, это опустить бит об конверторе и просто использовать преобразователь по умолчанию (сгенерированный?). Я уронил этот класс. – Thufir

Смежные вопросы