2016-05-31 7 views
0

У меня есть 2 класса A и B, которые оба получили компанию. Компания A получила немного больше информации, чем компания B (Company имеет id, в то время как CNCompany doesn't). Я хочу сопоставить все поля с помощью orika. Если все поля имеют значение null, я хочу, чтобы объект был нулевым!Orika - Объект карты null, если все поля объекта равны нулю

Я попытался выразить это с помощью модульного теста. Что нужно сделать, чтобы добиться этого?

public class A { 

    private Company company; 

    public Company getCompany() { 
     return company; 
    } 

    public void setCompany(Company company) { 
     this.company = company; 
    } 

} 

public class B { 

    private CNCompany company; 

    public CNCompany getCompany() { 
     return company; 
    } 

    public void setCompany(CNCompany company) { 
     this.company = company; 
    } 

} 

public class Company { 

    private Id id; 
    private AccountId accountId; 

    public Id getId() { 
     return id; 
    } 

    public void setId(Id id) { 
     this.id = id; 
    } 

    public AccountId getAccountId() { 
     return accountId; 
    } 

    public void setAccountId(AccountId accountId) { 
     this.accountId = accountId; 
    } 

} 

public class CNCompany { 

    private AccountId accountId 

    public AccountId getAccountId() { 
     return accountId; 
    } 

    public void setAccountId(AccountId accountId) { 
     this.accountId = accountId; 
    } 

} 

public class MyMapper extends ConfigurableMapper { 
    @Override 
    protected void configure(MapperFactory factory) { 
     factory.classMap(A.class, B.class) // 
       .mapNulls(false).mapNullsInReverse(false) // 
       .byDefault() // 
       .register(); 
    } 
} 

@Test 
public void testMap() throws Exception { 
    A a = new A(); 

    Company company = new Company(); 
    Id id = new Id(); 
    id.setValue("1"); 
    company.setId(id); 
    a.setCompany(company); 

    MyMapper myMapper = new MyMapper(); 
    B outcome = myMapper.map(a, B.class); 

    assertThat(outcome.getCompany(), is(nullValue())); 
} 

ответ

0

Если я правильно понимаю, что вы хотите getCompany вернуть null если Company объект содержит только нулевые значения.

В Orika вы можете управлять конверсией с custom converter. Для примера, который может выглядеть примерно так:

public class CompanyConverter extends CustomConverter<Company, CNCompany> { 
    public CNCompany convert(Company source, Type<? extends CNCompany> destinationType) { 
     if (isNothingButNulls(source)) { 
      return null; 
     } 
     final CNCompany newCompany = new CNCompany(); 
     // do your thing 
     return newCompany; 
    } 
} 

Я никогда не писал CustomConverter, что может вернуться null, так что я не 100% уверен, что это будет работать, но это должно быть. Обратите внимание, что конвертер все равно должен быть зарегистрирован. Связанная с документацией документа показывает, как зарегистрироваться в зависимости от того, на каком уровне вы хотите конвертировать.

+0

Проблема заключается в том, что метод isNothingButNulls (источник). Мне нужно пройти все дочерние элементы (и дочерние элементы childs и т. Д.) И проверить, являются ли они пустыми. – Chris311

+0

Сверху моей головы. Думаю, вы могли бы использовать отражения для повторения над детьми и проверки на нуль. Я как бы понял, что это была легкая часть, но теперь, когда я думаю об этом, это будет немного больно. – kab

+0

Да, я тоже так думаю. Представьте, что вы хотите сделать это для разных объектов или определенных объектов в других объектах (каскад) ... – Chris311