Проблема с компонентом Tapestry 5 BeanEditForm - PullRequest
1 голос
/ 20 марта 2011

У меня возникли проблемы с выяснением, как работать с компонентом BeanEditForm.Видите ли, с этим все в порядке (он отображает то, что должен), пока я не использую параметризованные конструкторы для своего класса бобов (и я нуждаюсь в них).Вот как выглядит мой класс Bean:

public class Celebrity {
    private String firstName;
    private String lastName;
    private long ID;
    private Date dateOfBirth;
    private Occupation occupation;
    private String biography;
    private boolean birthDateVerified;

    public Celebrity() {
    }

    public Celebrity(String firstName, String lastName, Date dateOfBirth, Occupation occupation, String biography, boolean birthDateVerified) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.dateOfBirth = dateOfBirth;
        this.occupation = occupation;
        this.biography = biography;
        this.birthDateVerified = birthDateVerified;
    }

    public Celebrity(String firstName, String lastName, Date dateOfBirth, Occupation occupation) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.dateOfBirth = dateOfBirth;
        this.occupation = occupation;
    }


    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }


    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public long getID() {
        return ID;
    }

    public void setID(long ID) {
        this.ID = ID;
    }

    public Date getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(Date dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    public Occupation getOccupation() {
        return occupation;
    }

    public void setOccupation(Occupation occupation) {
        this.occupation = occupation;
    }

    /**
     * @return the biography
     */
    public String getBiography() {
        return biography;
    }


    public void setBiography(String biography) {
        this.biography = biography;
    }

    public boolean getBirthDateVerified() {
        return birthDateVerified;
    }

    public void setBirthDateVerified(boolean birthDateVerified) {
        this.birthDateVerified = birthDateVerified;
    }
}

Это мой шаблон гобелена: AddNewCelebrity.tml

<html t:type="layout" title="Celebrity Details"
      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
      xmlns:p="tapestry:parameter">

    <head>
        <Title>Adding new celebrety</Title>
    </head>

    <body>
        <t:beaneditform t:id="celebrity"/>
    </body>

</html>

И его класс Java:

public class AddNewCelebrity {

    @Persist
    private Celebrity celebrity;

    public Celebrity getCelebrity() {
        return celebrity;
    }

    public void setCelebrity(Celebrity celeb) {
        this.celebrity = celeb;
    }
}

Это ошибка, которую я получаю из гобелена, когда я не комментирую мои параметризованные конструкторы:

Ошибка рендеринга в очереди в SetupRender [AddNewCelebrity: celebrity.editor]: Экземпляр исключительной ситуации com.celebreties.celebs.model.Celebrity (для компонента «AddNewCelebrity: celebrity.editor»): ошибка при вызове конструктора com.celebreties.celebs.model.Celebrity (строка, строка, дата, профессия, строка, логическое значение) (в Celebrity.java:29) (для сервиса 'BeanModelSource'): ни один сервис не реализует интерфейс java.lang.String.

Я использую гобелен 5.2.4 с Tomcat 6.0.32

Пожалуйста, дайте некоторые рекомендациичто я могу сделать.

Ответы [ 5 ]

5 голосов
/ 20 марта 2011

Очевидно, BeanEditForm не знает, какие параметры передать конструктору.Он пытается найти подходящую службу для каждого параметра, но No service implements the interface java.lang.String, поэтому это не может быть сделано.Я не могу объяснить, почему он не будет просто использовать конструктор без аргументов вместо попытки угадать параметры для одного из других конструкторов.

Тем не менее, вы можете легко обойти это, просто создав экземпляр объектаперед передачей в качестве параметра:

public Celebrity getCelebrity() {
    if (celebrity == null) {
      celebrity = new Celebrity(...);
    }
    return celebrity;
}
2 голосов
/ 23 мая 2011

Это было недавно добавлено как официальный FAQ:

http://tapestry.apache.org/beaneditform-faq.html

Когда вы визуализируете BeanEditForm или когда передается визуализированная форма, Tapestry должен создать экземпляр объекта, который нужно отредактировать. Это происходит, когда параметр объекта BeanEditForm связан со значением NULL: Tapestry создает экземпляр экземпляра типа свойства, так что BeanEditForm имеет объект для чтения значений по умолчанию или для отправки отправленных значений.

По умолчанию при этом используется стандартный механизм внедрения, что означает, что Tapestry будет идентифицировать открытый конструктор с наибольшим количеством параметров и попытаться найти объекты и другие объекты для каждого параметра конструктора.

Есть два способа точной настройки, чтобы вы не получили ошибок:

Поместите аннотацию @Inject на правильный используемый конструктор (часто это конструктор без параметров).

public class MyBean {
   @Inject
   public MyBean() { ... }


   // For testing
   public MyBean(String value, boolean flag, int index) { ... }

   ...
}

Или предоставьте метод обработчика события для события «prepare» и поместите экземплярный экземпляр в свойство.

public class MyPage {
  @Property
  public MyBean myBean;

  // The template contains <t:beaneditform t:id="mybeaneditor"/> ...

  void onPrepareFromMyBeanEditor() {
    myBean = new MyBean();
  }
}
2 голосов
/ 25 марта 2011

У меня была похожая проблема некоторое время назад.Пожалуйста, проверьте эту ветку: http://tapestry -users.832.n2.nabble.com / T5-2-Constructor-issue-td5603058.html

Что должно помочь вам, это комментировать по умолчаниюконструктор с @ Inject

С уважением, Михал

1 голос
/ 03 июля 2012

Я столкнулся с подобной проблемой всего несколько минут назад.Я использую NetBeans и я импортировал классы сущностей из баз данных.В любом случае, если вы импортировали классы сущностей, IDE генерирует 3 конструктора, и все, что вам действительно нужно, это один - пустой, например, вы можете просто стереть два других конструктора, и все будет работать нормально, если вы добавите аннотацию @Property.

вот так:

 @Property
 @Persist
 private Celebrity celebrity;

и сотри эти два конструктора в классе сущностей!

С уважением, Милош Д.

0 голосов
/ 04 сентября 2013

Если вам нужно больше конструкторов, просто поместите аннотацию @Inject над конструктором по умолчанию.Вы сможете использовать конструктор с параметрами, а Tapestry будет использовать конструктор по умолчанию.

...