2016-09-21 3 views
6

Stringという変数を受け入れるフォームがありますが、の各文字列プロパティが対応する型に変換されるようにClassインスタンスを生成します。クラスのプロパティ名で識別されます。フォームの入力値を他のJava型に動的に変換してクラスインスタンスを生成するクラス

私がNAMEという名前のフォームに3つのフィールドがある場合、ANNUAL SALARYisLocalResident。このフォームをのインスタンスに変換します。これらのプロパティは、String,BigIntegerBooleanタイプです。

どうすればよいですか?

現在、私はBeanUtilのプロパティを使用していますが、Javaのプロパティですが、必要な型に変換されないため、自分の要件を満たしません。むしろそれは私に希望のタイプのセッターとゲッタを求めます。 私を助けてください。どんな提案もありがたいですか?

Pこのフォームは動的であることに注意してください。フィールドの数と名前は別の入力に依存することに注意してください。 次のコードは、Employee1クラスのインスタンスemp1を生成しています。

public Empolyee1 setContent(List<String> nameList, List<String> valueList) { 
    Empolyee1 emp1 = new Empolyee1(); 

    for(String attr : nameList) { 
     if(attr.equalsIgnoreCase("name")) { 
      if(valueList.get(nameList.indexOf("name")) != null && !valueList.get(nameList.indexOf("name")).trim().equals("")) { 
       emp1.setName(valueList.get(nameList.indexOf("name"))); 
      } 
    } else { 
     if(attr.equalsIgnoreCase("ANNUAL SALARY")) { 
      if(valueList.get(nameList.indexOf("ANNUAL SALARY")) != null && !valueList.get(nameList.indexOf("ANNUAL SALARY")).trim().equals("")) { 
        emp1.setAnnualSalary(valueList.get(nameList.indexOf("ANNUAL SALARY"))); 
      } 
     } else { 
      if(attr.equalsIgnoreCase("isLocalResident")) { 
       if(valueList.get(nameList.indexOf("isLocalResident")) != null && !valueList.get(nameList.indexOf("isLocalResident")).trim().equals("")) { 
        emp1.setIsLocalResident(valueList.get(nameList.indexOf("isLocalResident")));  
       } 
      } 
     } 
    } 
    return empl1; 
} 
+0

動的な属性の数(ダイナミックタイプの)が自動的に変換されたクラスをインスタンス化しますか?属性の数と種類はわかりませんが、属性の全体数と種類は分かりますか?あなたは、(例えば)50の可能な属性を知っていますか?フォーム内のすべての順列で組み合わせることができますか? –

+0

これを参照してください。 http://stackoverflow.com/questions/13868986/dynamically-create-an-object-in-java-from-a-class-name-and-set-class-fields-by-u – Vel

+0

@AndreaLigios、はい私は知っています属性の総数と型。たとえば、合計100個の属性を持つ10の異なるクラスがあります。また、各クラスは異なる数の属性を持つことができます。そして私はgetterとsetterを含む10のクラスのそれぞれに対してxsdを持っています。今、UIから選択したクラスを設定する必要があります。 –

答えて

0

重要なポイントは、フィールド名をJava Beanプロパティ名に変換しています。 toPropertyNameメソッドは、あなたの質問の例に基づいた簡単な実装です。

public static String toPropertyName(String s) { 
    int len = s.length(); 
    StringBuilder sb = new StringBuilder(len); 
    boolean toUpper = false; 
    boolean isLower = false; 
    for (int i = 0; i < len; i++) { 
     char ch = s.charAt(i); 
     if (Character.isLetterOrDigit(ch)) { 
      if (Character.isUpperCase(ch)) { 
       sb.append((toUpper || isLower)?ch:Character.toLowerCase(ch)); 
       isLower = false; 
      } else { 
       isLower = true; 
       sb.append(toUpper?Character.toUpperCase(ch):ch); 
      } 
      toUpper = false; 
     } else { 
      isLower = false; 
      toUpper = true; 
     } 
    } 
    return sb.toString(); 
} 

public Empolyee1 setContent(List<String> nameList, List<String> valueList) throws Exception { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    Iterator<String> nameIter = nameList.iterator(); 
    Iterator<String> valueIter = valueList.iterator(); 
    while (nameIter.hasNext()) { 
     String name = (String) nameIter.next(); 
     map.put(toPropertyName(name), valueIter.hasNext()?valueIter.next():null); 
    } 
    Empolyee1 emp1= new Empolyee1(); 
    BeanUtils.populate(emp1, map); 
    return emp1; 
} 

BeanUtils.populate(emp1, map) APIは他の仕事を取るために使用されている(ネストされたBeanのプロパティをサポートする必要がある場合Bewared!、...あなたのコードがCVE-2014-0114の潜在的なクラスローダの脆弱性を防ぐことを確認してください)。各Java Beanプロパティの入力値と呼び出しセッターを変換します。

関連する問題