Как Сериализовать Интерфейс внутри Сериализуемого Бина - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть класс Serializable Bean, который состоит из экземпляра интерфейса dozerMapper из MapperIF. Все работало нормально, прежде чем я добавил PersistentManager в файл context.xm на сервере Tomcat. С PersistentManager я сохраняю все Объекты в сеансе в виде файла в папке. Но после того, как я добавил PersistentManager, он начал выдавать NotSerializableException из-за интерфейса MapperIF внутри моего класса Bean. Добавление ключевого слова transient к MapperIF может решить проблему NotSerializableException, но в итоге он заканчивается NullPointerException, так как dozerMapper.map становится пустым в приведенном ниже коде. Так, как я могу справиться с этой ситуацией для сериализации моего класса бина.

@Autowired
private transient MapperIF dozerMapper;

    public Preferences getUiPreferences() {
    if (this.uiPreferences == null) {
        this.uiPreferences = ((Preferences) this.dozerMapper.map(
                getPrefernces(), Preferences.class));
    }
    return this.uiPreferences;
}  

1 Ответ

0 голосов
/ 12 апреля 2019

Интерфейс MapperIF (или его замена Dozer 5.x Mapper) не расширяется Serializable.Стандартные классы реализации также не реализуют его.Поэтому стандартные реализации не будут сериализуемыми.

Я могу придумать способы решить эту проблему:

  • Не помещайте ссылку MapperIF в объектчто вы сохраните в сессии.Это действительно не принадлежит там.Вот что говорят Javadoc для класса DozerBeanMapper:

    Это должно использоваться / определяться как одноэлементное в вашем приложении.Этот класс выполняет несколько разовых инициализаций и загружает пользовательские сопоставления xml, поэтому вам не нужно создавать много экземпляров для повышения производительности.Обычно система имеет только один экземпляр DozerBeanMapper на виртуальную машину.Если вы используете платформу IOC (т. Е. Spring), определите Mapper как singleton = "true".Если вы не используете платформу IOC, в Dozer jar предусмотрен класс удобства DozerBeanMapperSingletonWrapper.

    Это означает, что вам не нужно нужно , чтобы поставить MapperIF объект в сеансе.

  • Объявите поле как transient и реализуйте пользовательский метод readObject, который будет заполнять поле (откуда-то) при десериализации.

  • Реализуйте свой собственный класс MapperIF / Mapper, который можно сериализировать.(Я не смотрел, но это может быть много работы ... или невозможно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...