Struts2 xwork Преобразование типов в спящем режиме - PullRequest
3 голосов
/ 25 января 2011

Каков наилучший способ преобразования типов в приложении Struts2?

Сейчас я хочу создать CRUD для определенного спящего объекта в моем приложении. Скажем, я хотел изменить Account, с которым связан User. Я могу просто передать параметр user.account.id с определенным значением, при условии, что у меня есть все правильные методы получения / установки.

Это прекрасно работает при первом создании объекта, где учетная запись будет нулевой. Это заставляет ognl создать новый объект учетной записи и установить идентификатор для того, что было передано.

Проблема возникает при попытке изменить инкапсулированный объект Account. Используя тот же параметр user.account.id, ognl интерпретирует это как getUser().getAccount().setId(param). Hibernate интерпретирует это как попытку изменить первичный ключ.

Я понимаю, почему это происходит, мне просто интересно, есть ли лучший способ разобраться с этим делом. Это очень распространено в нашем приложении, и я не хочу продолжать создавать несколько объектов и маршалировать их, прежде чем сохранять их в режиме гибернации.

У кого-нибудь нет лучшего способа решить эту проблему в Struts2?

1 Ответ

3 голосов
/ 25 января 2011

Тип преобразователей для постоянства

Создайте преобразователь типа для сущности, а затем просто передайте user.account вместо user.account.id. Это вызовет getUser().setAccount(account) и не вызовет у вас головной боли.

Когда вы обновляете запись, просто передайте user.account как скрытое поле в форме.

Что касается широко распространенного решения для ваших организаций, у вас есть несколько вариантов:

Несколько конвертеров

Создайте абстрактный преобразователь типов, который обрабатывает большую часть логики, чтобы у вас был действительно легкий подкласс для каждой сущности. Зарегистрируйте каждый конвертер в вашем xwork-conversion.properties.

Интерфейсно-управляемый преобразователь

Подход, который я использую, заключается в том, что у меня есть интерфейс под названием IdBasedJpaEntity, который реализуют 99,9% моих организаций. Он определяет getId() метод типа Integer. Затем у меня есть JpaDAORegistry синглтон-класс, который я создаю при запуске моего приложения. Я регистрирую каждую из своих сущностей в нем, и он создает отдельный экземпляр каждого DAO (в основном, синглтон де-факто). У меня есть карта класса сущности для экземпляра DAO. Это позволяет моему конвертеру типов искать соответствующий экземпляр DAO для любого данного IdBasedJpaEntity, позволяя мне иметь единственный класс JpaEntityConverter, который работает с любым объектом, который реализует интерфейс. Этот маршрут немного сложнее, но для меня он оказался многократно используемым.

...