私は、国、企業、ユーザーなどデータベースのカタログを管理するためのモジュールを構築しようとしています。カタログをコンボボックスから取得すると、システムはプリンシパル列(データベースにNULLでなく、私によって事前に定義されたもの)を持つテーブルを表示することになっています。 3つの目的から、私は2: を達成しました。 を使用してカタログを選択した後、エンティティクラスの@NotNull
フィールドを取得します。2.上記からも動的な列を含むテーブルを表示します。 しかし、数字3は私にトラブルを与えています。事は、私は(私は、オブジェクトに格納された@NotNull
フィールドに基づいて)動的に列を表示するためのビューでこのfollingコードを使用、である(https://www.primefaces.org/showcase/ui/data/datatable/columns.xhtml):(java.lang.Class)クラスをリフレクションで取得したクラスにキャストする方法
<p:dataTable id="conceptos" var="pojo" value="#{catalogoMB.comocombo}>
<p:columns value="#{catalogoMB.columns}" var="column"
columnIndexVar="colIndex" sortBy="#{pojo[column.property]}" filterBy="#
{pojo[column.property]}">
<f:facet name="header">
<h:outputText value="#{column.header}" />
</f:facet>
<h:outputText value="#{pojo[column.property]}" />
</p:columns>
</p:dataTable>
したがって例えば、通常の方法で、なし上記のコードは次のように動作します: comocomboの名前は、名前、値、IDです。私の列の配列は同じです:名前、値、ID ... 事は、comocombo
はList<Object>
オブジェクトです。フィールドのリフレクションクラスの値を格納するオブジェクトで、EntityClassのインスタンスの代わりにjava.lang.classを返します私はそのクラス(combito)のオブジェクトインスタンスからsetterとgetterを呼び出すことができましたが( )、pojo[column.property]
- > comocombo ["id"]、comocombo ["name"]またはcomocombo ["value" ]それは私に例外を送信するjava.lang.class
は、この任意のプロパティを持っていない....どのように私はそれらに到達することはできますか?私はMap<String, String>
と.cast()
について読んだことがありますが、私はこれが道になるかもしれません。
public void populateT(){
comocombo=new ArrayList<>();
Object tt ;
y = tabla.get(tabla.size()-1).getConcpetos(); //result of query type:
FindAll from the entity Class
try{
Class combito= Class.forName("sipe.services."+ catName); //the "path" of the
Entity Classes
for (Integer j=0; j<y.size()-1; j++){
tt=y.get(j);
for (Integer i=0; i< tabla.size()-1; i++){
tucampo=minustomayus(y.get(j).getClass().getDeclaredField(tabla.get(i).getNombre_c()).getName()); //tabla.get(i).getNombre_c()-> here I've stored the @NotNull properties' names (countryid, countryname...) whic are the same in columns = new ArrayList<ColumnModel>(); (catalogoMB.columns in the view)
Class cls= Class.forName("sipe.services."+ catName);
Method method = cls.getDeclaredMethod("get"+tucampo); // for example "countryid" -> getCountryid
Class<?> type = null;
for (Method methods : combito.getDeclaredMethods())
{ //Here I'm trying to invoke setter of the Entity Class in order to store its values..
//equivalent to: if o is an instance of Entity Class Country: Country o = new Country(); o.setCountryid(2);
if (methods.getName().contains("set"+tucampo)){
type=method.getReturnType();
methods.invoke(combito.newInstance(),method.invoke(tt));
}
}
に対処するために、あなたを忘れないでくださいFaceletsのを願ってコンボボックスの値がentiであるコンボボックスで、選択した値に基づいてデータテーブルの列を動的にロードしたいクラス? – Kaizen
はい@Kaizen、私はすでにこれを達成しています:自分のデータテーブルに列を動的に追加...各エンティティクラスに応じて選択...私のオブジェクトはJavaであるため、これらの列に従ってデータを表示しようとすると問題が発生しました。 lang.Class(反射の効果)とp:dataTableの変数はプロパティに到達しません... –
あなたの質問に答えて受け入れることができます:) – Kaizen