Проблема со швом: не удалось установить значение поля по отражению - PullRequest
6 голосов
/ 01 октября 2008

У меня проблема с кодом Seam, и я не могу понять, что я делаю неправильно. Это делает мою голову :) Вот выдержка из трассировки стека:

Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.oobjects.sso.manager.home.PresenceHome.customerId to java.lang.String

Я пытаюсь передать набор параметров моего URL в один из моих bean-компонентов. Для этого в файле pages.xml настроены следующие элементы:

<page view-id="/customer/presences.xhtml">
  <begin-conversation flush-mode="MANUAL" join="true" />
  <param name="customerId" value="#{presenceHome.customerId}" />
  <raise-event type="PresenceHome.init" />
  <navigation>
    <rule if-outcome="persisted">
      <end-conversation />
      <redirect view-id="/customer/presences.xhtml" />
    </rule>
  </navigation>
</page>

Мой боб начинается так:

@Name("presenceHome")
@Scope(ScopeType.CONVERSATION)
public class PresenceHome extends EntityHome<Presence> implements Serializable {
  @In
  private CustomerDao customerDao;

  @In(required = false)
  private Long presenceId;

  @In(required = false)
  private Long customerId;

  private Customer customer;

  // Getters, setters and other methods follow. They return the correct types defined above
}

Наконец, ссылка, которую я использую, чтобы связать одну страницу со следующей, выглядит так:

<s:link styleClass="#{selected == 'presences' ? 'selected' : ''}"
    view="/customer/presences.xhtml" title="Presences" propagation="none">
    <f:param name="customerId" value="#{customerId}" />
    Presences
</s:link>

Все это, кажется, работает нормально. При наведении указателя мыши на ссылку выше на моей странице я получаю URL, оканчивающийся на что-то вроде «? CustomerId = 123». Таким образом, параметр передается, и его можно легко преобразовать в тип Long. Но по какой-то причине это не так. Я делал подобные вещи раньше в других проектах, и тогда это сработало. Я просто не вижу, что сейчас не работает.

Если я удаляю элемент из объявления моей страницы, я попадаю на страницу в порядке.

Итак, у кого-нибудь есть мысли?

Ответы [ 4 ]

7 голосов
/ 01 октября 2008

Вы хотите добавить конвертер в ваш файл pages.xml. Как это:

<param name="customerId" 
      value="#{presenceHome.customerId}" 
converterId="javax.faces.Long" />

См. Пример с Seampay, предоставленный с seam для более подробной информации.

0 голосов
/ 01 октября 2008

Наш код делает нечто похожее, но со свойством customerId в классе Java как String :

private String customerId;

public String getCustomerId() {
    return customerId;
}

public void setCustomerId(final String customerId) {
    this.customerId = customerId;
}
0 голосов
/ 01 октября 2008

Вы можете попробовать использовать редактор свойств.

Поместите это в ту же упаковку, что и ваш боб:

import java.beans.PropertyEditorSupport;

public class PresenceHomeEditor extends PropertyEditorSupport {
    public void setAsText(final String text) throws IllegalArgumentException {
        try {
            final Long value = Long.decode(text);
            setValue(value);
        } catch (final NumberFormatException e) {
            super.setAsText(text);
        }
    }
}
0 голосов
/ 01 октября 2008

попробовать: ... <f:param name="customerId" value="#{customerId.toString()}" /> ...

...