Мы планируем обновить наш продукт до 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();