Мне было интересно, если этот рецепт не использует Open Session in View или Dozer работает (сценарий - это приложение spring, jsf, hibernate):
У меня есть это во внутреннем модуле:
public abstract class AbstractMap<E extends Serializable> implements Mapper<E> {
public abstract E map(E e) ;
public List<E> map(List<E> l) {
List<E> map = new ArrayList<E>();
for (E t : l) {
map.add(this.map(t));
}
return map;
}
}
@Component
public class PersonService extends AbstractService<Person>{
@Autowired
PersonDAO personDao;
@Transacted
public List<Person> findPeople(Mapper<Person> m, PersonFilter filter) {
return m.map(personDao.findByFilter(filter));
}
}
Во внешнем интерфейсе у меня есть этот bean-компонент jsb:
@Component
@Scope("session")
public class PersonBean {
@Autowired
PersonService personService;
PersonFilter personFilter;
List<Person> getPeople() {
return personService.findPeople(new AbstractMap<People>() {
public Person map(Person person) {
Person dto = new Person();
dto.setName(person.getName());
dto.setAddresses(new AbstractMap<Address>() {
public Address map(Address a) {
Address dto = new Address();
dto.setStreet(a.getStreet());
return dto;
}
}.map(person.getAddresses()));
return dto;
}
}, personFilter);
}
}
С моей точки зрения, есть некоторые преимущества:
- интерфейс должен указывать, чтоон хочет извлекать каждый вызов на сервер.
- если нужно использовать маппер в более чем одном месте, я могу переместить код карты во внешний класс.
- открыть и закрыть сервертранзакция.
- не требуется повторяющийся код для определения DTO для Person и Address.
Какие проблемы могут вызвать это предлагаемое решение?