Укажите пакеты JAXB в SLSB и JAX-WS

#java #jaxb #jax-ws #jersey

#java #jaxb #jax-ws #джерси

Вопрос:

Я создаю простой веб-сервис SOAP, используя аннотации SLSB и JAX-WS. Объекты, которые я хотел бы передать, являются JAXB, сгенерированными из схем OGC, спасибо за проект OGC на java.net . Один конкретный метод, с которым у меня возникли проблемы (который приводит к сбою развертывания), — это ситуация, когда поле (EventTime) объекта запроса (GetResult) находится в пакете, отличном от объекта запроса. ObjectFactory для этого типа отличается, и возникает проблема при сортировке / отмене сортировки.

Подмножество ошибок, которые я получаю:


There's no ObjectFactory with an @XmlElementDecl for the element
{http://www.opengis.net/ogc}temporalOps.
this problem is related to the following location:
at protected javax.xml.bind.JAXBElement
net.opengis.sos.v_1_0_0.GetResult$EventTime.temporalOps
at net.opengis.sos.v_1_0_0.GetResult$EventTime
at protected java.util.List
net.opengis.sos.v_1_0_0.GetResult.eventTime
at net.opengis.sos.v_1_0_0.GetResult
at public net.opengis.sos.v_1_0_0.GetResult
net.opengis.sos.v_1_0_0.ObjectFactory.createGetResult()
at net.opengis.sos.v_1_0_0.ObjectFactory

В стандартном приложении SE, когда я инициализирую JAXBContext, как показано ниже, все работает хорошо.

    JAXBContext context = JAXBContext.newInstance("net.opengis.sos.v_1_0_0:net.opengis.sensorml.v_1_0_1:net.opengis.sos.v_1_0_0.filter.v_1_1_0");
  

Как мне установить пакеты JAXB в контексте JAX-WS?

Мой сервер приложений / среда — GF 3.1.

Спасибо за помощь!

Стив

Комментарии:

1. Этот блог , указывающий на использование @XmlSeeAlso в классе service, выглядит многообещающим, но, похоже, он не был принят до JAX-WS 2.2. Metro (через проект JAX-RS RI), похоже, поддерживает спецификацию 2.2 … но у меня это пока не работает. Пробую это на GF 3.0.1 … возможно, у него нет совместимой версии JAX-WS. Попробуйте позже вечером. Есть у кого-нибудь соображения?

2. @XmlSeeAlso показался хорошим подходом, но не решил проблему. Мне указали на @UsesJAXBContext, но, похоже, в metro есть ошибка , из-за которой он не вызывает createJAXBContext() созданного мной JAXBContextFactory, который был открыт в течение нескольких лет. Расследование продолжается….

Ответ №1:

Я запустил его с помощью @UsesJAXBContext — сначала возникли небольшие проблемы, потому что NB 6.9 и 7.0b хотели связать com.sun.internal.* версии UsesJAXBContext и related, что, конечно, не то, что ищет JAX-WS RI. Как только я исправил это и добавил зависимость в jaxws-rt версии 2.2.3, все заработало отлично.

 @WebService(serviceName = "SOS")//, targetNamespace = "http://www.opengis.net/sos/1.0")
@UsesJAXBContext(value = SosServices.SosJaxbContext.class)
//@XmlSeeAlso({net.opengis.sos.v_1_0_0.filter.v_1_1_0.ObjectFactory.class, net.opengis.sensorml.v_1_0_1.ObjectFactory.class})
public class SosServices {

@WebMethod(operationName = "GetResult")
    public GetResultResponse getResult(GetResult request) {
        throw new UnsupportedOperationException();
    }

public static class SosJaxbContext implements JAXBContextFactory {

        @Override
        public JAXBRIContext createJAXBContext(SEIModel sei,
                List<Class> classesToBind, List<TypeReference> typeReferences)
                throws JAXBException {

            List<Class> classList = new ArrayList<Class>();
            classList.addAll(classesToBind);
            classList.add(TemporalOpsType.class);

            List<TypeReference> refList = new ArrayList<TypeReference>();
            refList.addAll(typeReferences);
            refList.add(new TypeReference(new QName("http://www.opengis.net/ogc", "temporalOps"), TemporalOpsType.class));

            return JAXBRIContext.newInstance(classList.toArray(new Class[classList.size()]),
                    refList, null, sei.getTargetNamespace(), false, null);
        }
    }
}
  

Спасибо Алексею Валикову из ogc (java.net проект) список рассылки по указателю на @UsesJAXBContext!

Комментарии:

1. Не могли бы вы показать инструкции импорта для этих использований: JAXBContext, SEIModel, TypeReference? кажется, их несколько из разных пакетов, и я не уверен, какой именно.