目标
我正在实施一个相当旧的(但可悲的是不可更改的)界面的Web服务.我有一个问题,呼叫我的服务的客户端希望在SOAP响应中有一个命名空间,并且我很难改变它来匹配.
考虑到一个你好世界的例子,我想要这样:
Hello Catchwa!
看起来像这样:
Hello Catchwa!
我发现类似于我要做的事情here,但我遇到了类似的代码执行正常的麻烦. (我想坚持使用Metro,而不必更改为cxf或axis)
执行
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 classesToBind, List typeReferences) throws JAXBException {
List classList = new ArrayList();
classList.addAll(classesToBind);
List refList = new ArrayList();
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);
}
}
Web服务的一些测试代码是简单的:
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),上述代码不会影响我的Web服务输出(命名空间前缀仍然是“ns2”).