Аннотации Java политики хранения во время выполнения не работают в Weblogic 12C

Мы планируем обновить наш продукт до Web-logic 12.C и стека WebSphere 8 (ранее это были WLC 10.3.5 и WAS 7). Но проблема в одном из компонентов веб-службы, из-за которой все приложение не удалось развернуть в веб-логике. Он отлично работает с WebSphere 8.

При развертывании EAR сервер приложения выдает «Исключение [EclipseLink-59] (Eclipse Persistence Services — 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DescriptorException». После дополнительного анализа я нашел ниже код в одном из зависимых классов WebServce, вызывающих проблему,

@ExcludeAttribute
public Map getOperations(){
    Map map = new HashMap();
    //some operation
    return map;
}

@ExcludeAttribute описывает политики хранения во время выполнения, которые определены, как показано ниже.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExcludeAttribute {
}

Метод getOperations возвращает java.util.Map, который не работает с аннотациями хранения RunTime, но работает с любыми другими типами данных, такими как (Integer, Customer и т. д.). Я изменил на java.uitl.HashMap и не работал.

Я смог исправить это (скорее я бы назвал это обходным путем), используя следующую аннотацию:

@XmlTransient

Я понятия не имею, почему он не работает с java.uitl.Map. Любые мысли действительно дали бы большие пальцы!! Я отправил сообщение в службу поддержки Oracle, даже они еще не вернулись. Есть ли какие-либо известные проблемы с классом java.util.Map/Collection с комбинацией WEblogic12c/Annotations.

[ИЗМЕНИТЬ – 1]

Чтобы ответить на вопрос Догана, методы, которые возвращают тип данных, не являющийся коллекцией, не вызывают никаких исключений, например:

@ExcludeAttribute
public Integer getOperations(){
  return 1;
}

Где @ExcludeAttribute является пользовательской аннотацией, определяющей '@Retention(RetentionPolicy.RUNTIME)', и мне не нужно определять @XmlTransient для игнорирования. необходимо сохранить его или использовать аннотацию XMLTransient.

[Редактировать 2, на основе ответа @Doughan]

Я понимаю, что нам нужно явно аннотировать методы получения (как @XMLTransient), если они не должны отображаться из Weblogic 12C, и это никак не связано с аннотациями RuntTime Retention. Таким образом, любое обновление стека до 12C должно обновлять кодовую базу с помощью этой аннотации, если есть несопоставленные общедоступные методы получения. Я думаю, что это в значительной степени отвечает на мои опасения.

Поправьте меня, если я ошибаюсь.

Существующая база кода уже аннотирована аннотацией времени выполнения, и я подумал, что это вызывает проблему.

Подробная трассировка стека приведена ниже.

weblogic.application.ModuleException: [HTTP:101216]Сервлет: "com.chordiant.component.cxradecisions.decision.impl.internal.AssessmentDecisionInterfaceWebServiceWrapper" не удалось выполнить предварительную загрузку при запуске в веб-приложении: "/ra".

com.sun.xml.ws.spi.db.DatabindingException: Исключения дескриптора:

Исключение [EclipseLink-59] (Eclipse Persistence Services — 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DescriptorException Описание исключения: переменная экземпляра [responseButtons] не определена в классе домена [com.chordiant. dm.ra.bean.Assessment], либо он недоступен. Внутреннее исключение: java.lang.NoSuchFieldException: responseButtons Mapping: org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping[responseButtons] Дескриптор: XMLDescriptor(com.chordiant.dm.ra.bean.Assessment --> [])

Исключения времени выполнения:

            at com.sun.xml.ws.db.toplink.JAXBContextFactory.newContext(JAXBContextFactory.java:185)
            at com.sun.xml.ws.spi.db.BindingContextFactory.create(BindingContextFactory.java:179)
            at com.sun.xml.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:211)
            at com.sun.xml.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:185)

И у меня есть метод getResponseButtons(), определенный в классе Assessment

@ExcludeAttribute
    public Map getResponseButtons() {
        Map map = new HashMap();

person Satheesh Cheveri    schedule 05.06.2013    source источник


Ответы (1)


Примечание. Я EclipseLink JAXB (MOXy) руководитель и член JAXB (JSR-222) группа экспертов.

В WebLogic 12.1.1 вам нужно будет аннотировать это свойство с помощью @XmlTransient:

@ExcludeAttribute
public Map getOperations(){
    Map map = new HashMap();
    //some operation
    return map;
}

@ExcludeAttribute — это созданная нами пользовательская аннотация, в которой используется @Retention(RetentionPolicy.RUNTIME) (я предоставил фрагмент этой аннотации)

Пользовательские аннотации не влияют на то, как MOXy создает свои метаданные отображения. Ни в коем случае, просто потому, что аннотация называется @ExcludeAttribute MOXy не мог предположить, что ее следует рассматривать как @XmlTransient.

Но проблема в одном из компонентов веб-службы, из-за которой все приложение не удалось развернуть в веб-логике. Он отлично работает с WebSphere 8.

EclipseLink MOXy является провайдером JAXB по умолчанию в WebLogic, начиная с версии 12.1.1. Вы можете столкнуться с проблемой, когда ранее MOXy обрабатывал все свойства только с getметодом как write only свойств. Новые версии MOXy будут игнорировать эти свойства, если они явно не аннотированы. Это могло привести к тому, что вам показалось, что аннотация @ExcludeAttribute имела эффект.

Я немного запутался с использованием аннотации времени выполнения удержания

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

При развертывании EAR сервер приложения выдает «Исключение [EclipseLink-59] (Eclipse Persistence Services — 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DescriptorException»

Если содержимое этого свойства предназначено для сопоставления, не могли бы вы поделиться полной трассировкой стека?

person bdoughan    schedule 05.06.2013
comment
@ExcludeAttribute — это созданная нами пользовательская аннотация, в которой используется @Retention(RetentionPolicy.RUNTIME) (я предоставил фрагмент этой аннотации) - person Satheesh Cheveri; 05.06.2013
comment
@Doughan, я отредактировал свой вопрос (edit-1) - спасибо за ваш вклад. - person Satheesh Cheveri; 05.06.2013
comment
Спасибо, теперь у меня есть лучшая картина, для удобства и удобочитаемости обновляю свои вопросы - person Satheesh Cheveri; 06.06.2013