Open Session in View или DTO решение - PullRequest
1 голос
/ 24 января 2012

Мне было интересно, если этот рецепт не использует 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.

Какие проблемы могут вызвать это предлагаемое решение?

...