2011-03-20 9 views
1

BeanEditFormコンポーネントの使用方法を理解するのに少し問題があります。 私はBeanクラスのためにパラメータ化されたコンストラクタを使用していない限り、それがあれば何でも構いません。これは私のBeanクラスがどのように見えるかです:Tapestry 5 BeanEditFormコンポーネントの問題

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]:例外(コンポーネントの 'AddNewCelebrity:celebrity.editorを'):com.celebreties.celebs.model.Celebrityのインスタンスをインスタンス化エラーコンストラクタcom.celebreties.celebs.modelを呼び出します。 Celebrity(String、String、Date、Occupation、String、boolean)(Celebrity.java:29で)(サービス 'BeanModelSource'の場合):サービスはjava.lang.Stringインタフェースを実装していません。

私は、Tomcat 6.0.32

とタペストリー5.2.4を使用しています、私は何を行うことができますいくつかのガイドラインを与えてください。

答えて

5

明らかに、BeanEditFormはどのパラメータをコンストラクタに渡すべきかわかりません。 No service implements the interface java.lang.Stringでは各パラメータの一致するサービスを検索しようとしています。他のコンストラクタのいずれかのパラメータを推測するのではなく、単純にno-argsコンストラクタを使用しない理由を説明することはできません。

にもかかわらず、あなたは簡単に単純にパラメータとして渡す前にオブジェクトを自分でインスタンス化することによってこの問題を回避することができます

public Celebrity getCelebrity() { 
    if (celebrity == null) { 
     celebrity = new Celebrity(...); 
    } 
    return celebrity; 
} 
+0

Martinさん、ありがとう、これは私の問題を完全に解決しました。私はBeanEditFormのモデルコンポーネントとして挿入できる何らかの種類のモデルクラスを探し求めていました。そのような時間の無駄ではなかったが、これはよりエレガントなソリューションです。 –

2

でデフォルトコンストラクタに注釈を付けることで助けるべきこと:

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

BeanEditFormをレンダリングするとき、またはレンダリングされたフォームが送信されたときに、Tapestryは編集するオブジェクト。これは、BeanEditFormのオブジェクトパラメータがnullにバインドされている場合に発生します。Tapestryは、BeanEditFormにデフォルト値を読み込むオブジェクトまたは送信された値をプッシュするオブジェクトを持つように、プロパティタイプのインスタンスをインスタンス化します。デフォルトでは

が、これはタペストリーがほとんどのパラメータを持つpublicコンストラクタを識別し、それぞれのコンストラクタのパラメータのオブジェクトと他のオブジェクトを検索しようとすることを意味し、標準的な射出機構を、使用しています。

は微調整には2つの方法で、このようにあなたが取得しないエラーがあります:正しいコンストラクタに@Inject注釈が使用する

場所を(多くの場合、パラメータなしのコンストラクタ)。

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


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

    ... 
} 

または、「準備」イベントのイベントハンドラメソッドを提供し、プロパティにインスタンス化されたインスタンスを配置します。

public class MyPage { 
    @Property 
    public MyBean myBean; 

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

    void onPrepareFromMyBeanEditor() { 
    myBean = new MyBean(); 
    } 
} 
1

わずか数分前に同様の問題が発生しました。私はnetbeansを使用しており、私はdatabesからエンティティクラスをインポートしました。とにかく、あなたがエンティティクラスをインポートした場合、IDEは3つのコンストラクタを生成します。本当に必要なのは1つです。空の場合は、単に他の2つのコンストラクタを消去して、@Propertyアノテーションを追加するとうまくいきます。

@Property 
@Persist 
private Celebrity celebrity; 

とエンティティクラスでこれらの2つのコンストラクタを消去:そうのような

よろしく、 ミロスD.

-1

あなたはより多くのコンストラクタが必要な場合は、単にデフォルトのコンストラクタの上に注釈@Injectを置きます。パラメータを持つコンストラクタを使用することができ、Tapestryはデフォルトのコンストラクタを使用します。