1

Я искал вокруг на SOF, но не нашел такой основной вопрос, связанный с использованием BeanUtil.Как правильно использовать Apache Common BeanUtil's BeanComparator в интересах самоанализа?

У меня есть класс POJO, скажем, например UserPojo чей код класса:

public class UserPojo{ 

    private String name; 
    private int gender; 
    private int size; 

    //Setters 
    public void setName(String name) {this.name =name;} 
    public void setGender(int gender){this.gender=gender;} 
    public void setSize(int size) {this.size =size;} 

    //getters 
    public String getName() {return this.name;} 
    public int getGender(){return this.gender;} 
    public int getSize() {return this.size;} 
} 

Мой вопрос, как использовать BeanUtil для автоматического сравнения двух экземпляра данного компонента?

Я попытался это:

final BeanComparator<UserPojo> comparator = new BeanComparator<UserPojo>(); 
final int comparison = comparator.compare(expectedPojo, receivedPojo); 

Но закончить на следующей ошибки:

java.lang.ClassCastException : UserPojo cannot be cast to java.lang.Comparable 

Я понимаю, что мой Pojo должен реализовать стандартный Comparable интерфейс, но этот способ сравнения не полагайтесь на самоанализ и импорт BeanUtil кажется очень бесполезным ...

Итак, как правильно его использовать?

ответ

0

Ты должен смотреть на различные конструкторы там:

BeanComparator(String property)

  • Создаёт собственности на основе компаратор для бобов.

BeanComparator(String property, Comparator comparator)

  • Создаст собственности на основе компаратора для бобов.

Вот Javadoc бывший (в второй пункт ваш ответ):

Constructs a property-based comparator for beans. This compares two beans by the property specified in the property parameter. This constructor creates a BeanComparator that uses a ComparableComparator to compare the property values.

Passing "null" to this constructor will cause the BeanComparator to compare objects based on natural order, that is java.lang.Comparable.

Как и следовало ожидать, конструктор вы вызываете именно это и делает:

this(null); 

Для сравнения несколько свойств, вы могли бы использовать 2-й вариант

Collections.sort(collection, 
    new BeanComparator("property1", 
    new BeanComparator("property2", 
     new BeanComparator("property3")))); 

Я лично чувствовал, что Apache Commons CompareToBuilder и Google Guava’s ComparisonChain - лучший выбор.

+0

Не знаю, '' compareToBuilde' и comparisonChain' они позволяют автообновления боба comprarison? –

+0

Нет, но они помогают вам реализовать метод compareTo, так же, как 'EqualsBuilder' помогает вам построить метод' equals'. Не самое большое из преимуществ, которые я согласен, но мне нужно указать имена параметров (возможно, b/c использует отражение под капотом) в «BeanComparator» не подходит ко мне. – mystarrocks

0

Я, наконец, сдался и код этого. Это не ответ на вопрос, но это мой способ решения этой проблемы:

import org.apache.commons.beanutils.BeanUtils; 

public static void assertBeansEqual(final Object expected, final Object given) { 
    try { 
     final Map<String, String> expectedDescription = BeanUtils.describe(expected); 
     final Map<String, String> givenDescription = BeanUtils.describe(given); 

     // if the two bean don't share the same attributes. 
     if (!(expectedDescription.keySet().containsAll(givenDescription.keySet()))) { 
      final Set<String> keySet = givenDescription.keySet(); 
      keySet.removeAll(expectedDescription.keySet()); 
      fail("The expected bean has not the same attributes than the given bean, the followings fields are not present in the expected bean :" + keySet); 
     } 
     if (!(givenDescription.keySet().containsAll(expectedDescription.keySet()))) { 
      final Set<String> keySet = expectedDescription.keySet(); 
      keySet.removeAll(givenDescription.keySet()); 
      fail("The expected bean has not the same attributes than the given bean, the followings fields are not present in the given bean :" + keySet); 
     } 

     final List<String> differences = new LinkedList<String>(); 
     for (final String key : expectedDescription.keySet()) { 
      if (isNull(expectedDescription.get(key))) { 
       // if the bean1 value is null and not the other -> not equal. This test is 
       // required to avoid NPE attributes values are null. (null object dot not have 
       // equals method). 
       if (!isNull(givenDescription.get(key))) { 
        differences.add(key); 
       } 
      } 
      else { 
       // if two attributes don't share an attributes value. 
       if (!expectedDescription.get(key).equals(givenDescription.get(key))) { 
        differences.add(key); 
       } 
      } 
     } 
     if (!differences.isEmpty()) { 
      String attributes = ""; 
      for (final String attr : differences) { 
       attributes = attributes + "|" + attr; 
      } 
      fail("Assertion fail, the expected bean and the given bean attributes values differ for the followings attributes : " + attributes + "|"); 
     } 
    } 
    catch (final Exception e) { 
     e.printStackTrace(); 
     fail(e.getMessage()); 
    } 
}