Цель
Я реализую веб-сервис для довольно старого (но грустно неизменяемого) интерфейса. У меня проблема, когда клиент, который вызывает мой сервис, ожидает определенное пространство имен в ответе SOAP, и мне трудно изменить его, чтобы он соответствовал.
Учитывая пример приветствия, я хочу это:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:helloResponse xmlns:ns2="http://test/">
<return>Hello Catchwa!</return>
</ns2:helloResponse>
</S:Body>
</S:Envelope>
выглядеть следующим образом:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<customns:helloResponse xmlns:customns="http://test/">
<return>Hello Catchwa!</return>
</customns:helloResponse>
</S:Body>
</S:Envelope>
Я нашел нечто похожее на то, что я пытаюсь сделать здесь, но у меня возникли проблемы с тем, чтобы аналогичный код выполнялся правильно. (Я хотел бы придерживаться Metro и не должен меняться на cxf или ось)
Исполнение
Моя реализация JAXBContextFactory
, которая возвращает JAXBRIContext
выглядит следующим образом:
import com.sun.xml.bind.api.JAXBRIContext;
import com.sun.xml.bind.api.TypeReference;
import com.sun.xml.ws.api.model.SEIModel;
import com.sun.xml.ws.developer.JAXBContextFactory;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
public class HelloJaxbContext implements JAXBContextFactory
{
@Override
public JAXBRIContext createJAXBContext(SEIModel seim, List<Class> classesToBind, List<TypeReference> typeReferences) throws JAXBException {
List<Class> classList = new ArrayList<Class>();
classList.addAll(classesToBind);
List<TypeReference> refList = new ArrayList<TypeReference>();
for (TypeReference tr : typeReferences) {
refList.add(new TypeReference(new QName(tr.tagName.getNamespaceURI(), tr.tagName.getLocalPart(), "customns"), tr.type, tr.annotations));
}
return JAXBRIContext.newInstance(classList.toArray(new Class[classList.size()]), refList, null, seim.getTargetNamespace(), false, null);
}
}
Некоторые тестовые коды для веб-службы просто:
import com.sun.xml.ws.developer.UsesJAXBContext;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
@WebService(serviceName = "Hello")
@UsesJAXBContext(value = HelloJaxbContext.class)
public class Hello
{
@WebMethod(operationName = "hello")
public String hello(@WebParam(name = "name") String txt)
{
return "Hello " + txt + "!";
}
}
Вопросы
В Tomcat 7.0.32 и Glassfish 3.1.2 с использованием jaxws-rt 2.2.7 (из Maven) приведенный выше код не влияет на вывод моей веб-службы (префикс пространства имен по-прежнему "ns2" ).