Хорошо, вот что я теперь знаю. Это было проблемой для меня в течение нескольких месяцев.
Во-первых, вам необходимо изменить JAXBContext, используемый JAX-WS. Для этого используйте аннотацию @UsesJAXBContext на сервере. (com.sun.xml.ws.developer.UsesJAXBContext)
Затем в вашей фабричной реализации вы должны вернуть пользовательские мосты в этом методе.
public Bridge createBridge(final TypeReference typereference)
Тогда ваш пользовательский мост должен установить свойство marshaller для установки планировщика пространства имен, который вы хотите использовать.
Вот мой пример.
@WebService(serviceName = ...)
@UsesJAXBContext(MyContextFactory.class)
public class SoapServer { ... }
и класс завод ...
public static class MyContextFactory implements JAXBContextFactory
{
@Override
public JAXBRIContext createJAXBContext(final SEIModel sei,
@SuppressWarnings("rawtypes") final List<Class> classesToBind, final List<TypeReference> typeReferences)
throws JAXBException
{
JAXBRIContext context = JAXBContextFactory.DEFAULT.createJAXBContext(sei, classesToBind, typeReferences);
return new MyJaxwsContext(context);
}
}
и контекст impelementation JAXB ...
public class MyContext extends JAXBRIContext
{
/** the actual context */
private final JAXBRIContext delegate;
public MyContext(final JAXBRIContext createContext)
{
this.delegate = createContext;
}
public Bridge createBridge(final TypeReference arg0)
{
return new MyBridge((JAXBContextImpl) delegate, delegate.createBridge(arg0));
}
и теперь реализация моста ...
public class MyBridge extends Bridge
{
private final Bridge delegate;
protected MyBridge(final JAXBContextImpl context, final Bridge delegate)
{
super(context);
this.delegate = delegate;
}
// an example marshal call. There are many more...
public void marshal(final Marshaller m, final Object object, final ContentHandler contentHandler)
throws JAXBException
{
m.setProperty("com.sun.xml.bind.namespacePrefixMapper", namespaceMapper);
delegate.marshal(m, object, contentHandler);
}
ПРИМЕЧАНИЕ: Я только что завернул существующую реализацию. Все, что я хотел, это уметь фиксировать имена пространства имен. Из моего чтения источника (JAXWS) это единственный способ добраться до маршаллера.
NOTE2 В окончательном классе RI есть опускание. Это работает только с эталонной реализацией. YMMV
Благодарим вас за ответ. Однако ваше предложение, похоже, направлено на разработчиков, которые имеют доступ к серверной стороне, то есть к реализации веб-службы. Это не тот случай. Я только создаю клиента веб-сервиса. Единственной информацией, которую я имею о веб-службе, является wsdl и документация, которая рекомендует помещать схему расположения файла xsd в xml, который передается в конечную точку webservice – Arquebus
Так в чем же проблема? Вы не можете вызвать веб-сервис, потому что получаете какую-то ошибку? Или это более фундаментально? – Zagrev
Это фундаментальная «проблема». Я могу позвонить в webservice, и я не получаю никаких предупреждений или ошибок.Именно так, что поставщик webservice рекомендует установить схему бизнес-xsd, которая описывает схему бизнес-данных, в xml, который должен быть загружен. Мне интересно, почему нет способа сделать это в среде Java SE при использовании стек Metro JAXB, то есть не имеющий доступа к маршаллеру. – Arquebus