2015-06-05 30 views
7

ile ilgili basit bir sorunum var. Java JDK7'de çalışan bir programım var ama bazı iç gözlem değişikliklerinden dolayı JDK8'de çalışmıyor. İşte Java JDK 8 IndexedPropertyDescriptor, JDK 7'den beri Liste nesnesi

import java.beans.BeanInfo; 
import java.beans.IntrospectionException; 
import java.beans.Introspector; 
import java.beans.PropertyDescriptor; 
import java.util.ArrayList; 
import java.util.List; 

public class Main { 

    public static void main(String[] args) throws IntrospectionException { 
     BeanInfo info = Introspector.getBeanInfo(MyListClass.class); 
     PropertyDescriptor[] descriptors = info.getPropertyDescriptors(); 
     for (int i = 0; i < descriptors.length; i++) { 
      System.out.println(descriptors[i].getClass().getName() + ":" + descriptors[i].getName()); 
     } 

     System.out.println("\n"); 

     BeanInfo info2 = Introspector.getBeanInfo(MyIndexedListClass.class); 
     PropertyDescriptor[] descriptors2 = info2.getPropertyDescriptors(); 
     for (int i = 0; i < descriptors2.length; i++) { 
      System.out.println(descriptors2[i].getClass().getName() + ":" + descriptors2[i].getName()); 
     } 

     System.out.println("\n"); 

     BeanInfo info3 = Introspector.getBeanInfo(MyArrayClass.class); 
     PropertyDescriptor[] descriptors3 = info3.getPropertyDescriptors(); 
     for (int i = 0; i < descriptors3.length; i++) { 
      System.out.println(descriptors3[i].getClass().getName() + ":" + descriptors3[i].getName()); 
     } 

     System.out.println("\n"); 

     BeanInfo info4 = Introspector.getBeanInfo(MyIndexedArrayClass.class); 
     PropertyDescriptor[] descriptors4 = info4.getPropertyDescriptors(); 
     for (int i = 0; i < descriptors4.length; i++) { 
      System.out.println(descriptors4[i].getClass().getName() + ":" + descriptors4[i].getName()); 
     } 

    } 

    public class MyListClass { 
     private List<String> myListClass = new ArrayList<String>(); 

     public List<String> getMyListClass() { 
      return myListClass; 
     } 

     public void setMyListClass(List<String> myListClass) { 
      this.myListClass = myListClass; 
     } 

    } 

    public class MyIndexedListClass { 
     private List<String> myIndexedListClass = new ArrayList<String>(); 

     public String getMyIndexedListClass(int index) { 
      return myIndexedListClass.get(index); 
     } 

     public void setMyIndexedListClass(int index, String element) { 
      this.myIndexedListClass.set(index, element); 
     } 

     public List<String> getMyIndexedListClass() { 
      return myIndexedListClass; 
     } 

     public void setMyIndexedListClass(List<String> myIndexedListClass) { 
      this.myIndexedListClass = myIndexedListClass; 
     } 

    } 

    public class MyArrayClass { 
     private String[] myArrayClass = new String[20]; 

     public String[] getMyArrayClass() { 
      return myArrayClass; 
     } 

     public void setMyArrayClass(String[] myArrayClass) { 
      this.myArrayClass = myArrayClass; 
     } 

    } 

    public class MyIndexedArrayClass { 
     private String[] myIndexedArrayClass = new String[20]; 

     public String getMyIndexedArrayClass(int index) { 
      return myIndexedArrayClass[index]; 
     } 

     public void setMyIndexedArrayClass(int index, String myValue) { 
      this.myIndexedArrayClass[index] = myValue; 
     } 

     public String[] getMyIndexedArrayClass() { 
      return myIndexedArrayClass; 
     } 

     public void setMyIndexedArrayClass(String[] myIndexedArrayClass) { 
      this.myIndexedArrayClass = myIndexedArrayClass; 
     } 

    } 
} 

JDK 7 günlükleri: İşte

sorunu yeniden oluşturmak için bir test programı İşte

java.beans.PropertyDescriptor:class 
java.beans.PropertyDescriptor:myListClass 

java.beans.PropertyDescriptor:class 
java.beans.IndexedPropertyDescriptor:myIndexedListClass 

java.beans.PropertyDescriptor:class 
java.beans.PropertyDescriptor:myArrayClass 

java.beans.PropertyDescriptor:class 
java.beans.IndexedPropertyDescriptor:myIndexedArrayClass 

JDK8 için günlükleri:

java.beans.PropertyDescriptor:class 
java.beans.PropertyDescriptor:myListClass 

java.beans.PropertyDescriptor:class 
java.beans.PropertyDescriptor:myIndexedListClass -> Here is the change 

java.beans.PropertyDescriptor:class 
java.beans.PropertyDescriptor:myArrayClass 

java.beans.PropertyDescriptor:class 
java.beans.IndexedPropertyDescriptor:myIndexedArrayClass 

ben JDK8'i gerçekten yakında kullanmak zorundayım, ancak uygulama artık çalışmıyor çünkü bu bir engelleme değişikliğidir. Collection arabirimini genişleten tüm sınıflarla bu sorunu yaşıyorum (Liste, Harita, ...)

Kod, Apache Commons'dan commons-beanutils-1.8.0 kütüphanesi tarafından kullanılır.

Uygulamamın JDK7'yi kullanırken daha önce olduğu gibi çalışmasını sağlamak için bir çözüm, bir geçici çözüm arıyorum, herhangi bir çözüm var mı?

JDK7: http://docs.oracle.com/javase/7/docs/api/java/beans/IndexedPropertyDescriptor.html

JDK8: http://docs.oracle.com/javase/8/docs/api/java/beans/IndexedPropertyDescriptor.html


I (Dizi değişmedi çünkü) yerine listesi Diziyi İşte

resmi belgelere bağlantılar vardır kullanamazsınız

DÜZENLEME: Çözümümü buldum, problemim direkler ile ilgiliydi 1.3. Benim ActionForm benim endeksli alıcı/ayarlayıcı yeniden adlandırmak zorunda: http://www.coderanch.com/t/55172/Struts/Indexed-Properties

+0

Örneklerinizde fark görmüyorum. Tam olarak sorun nedir? –

+1

JDK 7'de BeanInfo'nun getPropertyDescritor yöntemi, MyIndexedListClass sınıfı için 'IndexedPropertyDescriptor' değerini döndürür ve JDK 8'de 'PropertyDescriptor' döndürür. –

cevap

5

Eh, şartname açıkça IndexedPropertyDescriptor ek dizi bazlı erişim yöntemine, başka bir şey olabileceğini söylüyor. Bu değişmedi. Burada sahip olduğunuz, List<String> yazıp yazılan bir özelliği ve aynı ada sahip bir dizinlenmiş String özelliğini tanımlayan çakışan özellik yöntemleridir. List tabanlı yöntemler hiçbir zaman dizinlenmiş özellik ile ilişkilendirilmemiştir.

Ne değişti, çakışan özelliklerden hangisinin onu BeanInfo içine alması ve hangilerinin bırakılacağıdır. Bu davranış, bir HashMap belirtilmemiş sırasına veya benzerlerine bağlı olabilir. Başka faktörler de olabilir. Dolayısıyla, bunu Java 7'ye karşı Java 8 sorunu olarak görmüyoruz, ancak yalnızca alternatif Java 7 uygulamaları arasında değişebilen bir uygulamaya bağımlı davranış.

Bu sorunu çözmenin iki yolu vardır.

public class MyIndexedListClass { 
    private List<String> myIndexedListClass = new ArrayList<String>(); 

    public String getMyIndexedListClass(int index) { 
     return myIndexedListClass.get(index); 
    } 

    public void setMyIndexedListClass(int index, String element) { 
     this.myIndexedListClass.set(index, element); 
    } 

    public List<String> getMyIndexedListClassAsList() { 
     return myIndexedListClass; 
    } 

    public void setMyIndexedListClassAsList(List<String> myIndexedListClass) { 
     this.myIndexedListClass = myIndexedListClass; 
    } 
} 

Sonra tüm Java sürümleri aynı davranacaktır, ama artık olarak farklı özelliklere adında iki farklı özellikler görme yan etkisi vardır: Sen özelliklerden birini yeniden adlandırarak çatışmayı çözebilir.


alternatiftir gibi yöntemleri tutmak ancak açıkça mülkiyet açıklayıcısı tanınmasından List dayalı yöntemler elide etmektir.Diğer bir deyişle, tek bir uygulamada gerçekleşen ve arzu ettiğiniz gibi görünen davranışı yapın.

public class MyIndexedListClass { 
    private List<String> myIndexedListClass = new ArrayList<String>(); 

    public String getMyIndexedListClass(int index) { 
     return myIndexedListClass.get(index); 
    } 
    public void setMyIndexedListClass(int index, String element) { 
     this.myIndexedListClass.set(index, element); 
    } 
    public List<String> getMyIndexedListClass() { 
     return myIndexedListClass; 
    } 
    public void setMyIndexedListClass(List<String> myIndexedListClass) { 
     this.myIndexedListClass = myIndexedListClass; 
    } 
} 
static // in your example all classes are inner classes 
public class MyIndexedListClassBeanInfo extends SimpleBeanInfo { 
    private PropertyDescriptor[] properties; 

    public MyIndexedListClassBeanInfo() throws IntrospectionException { 
    PropertyDescriptor[] p=Introspector.getBeanInfo(MyIndexedListClass.class, 
     Introspector.IGNORE_IMMEDIATE_BEANINFO).getPropertyDescriptors(); 
    ArrayList<PropertyDescriptor> list=new ArrayList<>(p.length+1); 
    for(PropertyDescriptor d: p) 
     if(!d.getName().equals("myIndexedListClass")) list.add(d); 
    list.add(new IndexedPropertyDescriptor("myIndexedListClass", 
     MyIndexedListClass.class, null, null, 
     "getMyIndexedListClass", "setMyIndexedListClass")); 
    properties=list.toArray(new PropertyDescriptor[list.size()]); 
    } 

    @Override 
    public PropertyDescriptor[] getPropertyDescriptors() { 
     return properties; 
    } 
}