tomcat - 使用 JAX-WS 引用实现的方法重载

标签 tomcat jax-ws classcastexception reference-implementation

WS-I 配置文件中不允许方法重载。通常的技巧似乎是添加 @WebMethod(operationName="...") 注释。如果我这样做,我会得到一个 ClassCastException。

下面是最小的例子。

接口(interface):

package org.example.test;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService(name = "service", targetNamespace = "http://www.example.org/test")
public interface IThing {

    @WebMethod(operationName = "f1")
    public String f(String s);

    @WebMethod(operationName = "f2")
    public String f(Integer i);
}

实现:

package org.example.test;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService(endpointInterface = "org.example.test.IThing", targetNamespace = "http://www.example.org/test", portName = "ThingPort", serviceName = "service")
public class Thing implements IThing {

    @Override
    @WebMethod(operationName = "f1")
    public String f(String s) {
        return "f1";
    }

    @Override
    @WebMethod(operationName = "f2")
    public String f(Integer i) {
        return "f2";
    }

}

JUnit 测试用例:

package org.example.test;

import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

import org.junit.Test;

public class TestThing {

    @Test
    public void testThing() throws Exception {
        URL urlURL = new URL("http://localhost:8080/wstest/SOAP");
        QName qname = new QName("http://www.example.org/test", "service");
        Service service = Service.create(urlURL, qname);
        IThing thing = service.getPort(IThing.class);
        thing.f("s");
        thing.f(1);
    }
}

使用的 JAX-WS 实现:

    compile group:'com.sun.xml.ws', name:'jaxws-rt', version:'2.2.7', transitive:true

轨迹轨迹:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at org.example.test.jaxws.F$JaxbAccessorF_arg0.set(FieldAccessor_Ref.java:60)
    at com.sun.xml.bind.v2.runtime.reflect.Accessor.setUnadapted(Accessor.java:166)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$6.set(JAXBContextImpl.java:980)
    at com.sun.xml.ws.db.glassfish.RawAccessorWrapper.set(RawAccessorWrapper.java:73)
    at com.sun.xml.ws.client.sei.BodyBuilder$DocLit.build(BodyBuilder.java:264)
    at com.sun.xml.ws.client.sei.BodyBuilder$JAXB.createMessage(BodyBuilder.java:103)
    at com.sun.xml.ws.client.sei.StubHandler.createRequestPacket(StubHandler.java:231)
    at com.sun.xml.ws.db.DatabindingImpl.serializeRequest(DatabindingImpl.java:195)
    at com.sun.xml.ws.db.DatabindingImpl.serializeRequest(DatabindingImpl.java:257)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:117)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:102)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:154)
    at com.sun.proxy.$Proxy31.f(Unknown Source)
    at org.example.test.TestThing.testThing(TestThing.java:19)

运行环境为Tomcat7。

我假设我也没有被迫重命名 Java 方法。我是吗?

包含 eclipse 项目的 zip 可在 http://ge.tt/1JrLxFh/v/0 获得。

最佳答案

您还需要确保区分参数。否则,模式会将相同类型与两种方法的参数相关联,从而有效地破坏您的重载意图。

@Override  
@WebMethod(operationName = "f2")  
@ResponseWrapper(className = "f2Response")  
@RequestWrapper(className = "f2")   
public String f(Integer i) {  
        return "f2";  
}

关于tomcat - 使用 JAX-WS 引用实现的方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16107454/

相关文章:

java - 在 Tomcat/Axis2 中使用 JAW-XS 注释

java - JAXWS/JAXB 检查对象是否为空(不是字符串)

java - 如何安全地将java对象转换为泛型集合?

java - 是否可以将所有 jar 存储在 Tomcat lib 文件夹中?

spring - HTTP 状态 404-未找到

javascript - Spring Boot 应用程序 JS 和 CSS 未在独立服务器中绑定(bind)(Apache Tomcat 版本 9.0)

java - jOpenDocument Sheet.getValueAt(int, int) 返回值既是 String 又是 BigDecimal?

java - 如何在部署在 Tomcat 中的 Alfresco 中部署模块

javax.xml.ws.Service 通过 SSL 使用 SOAP 服务

java - 应用程序在运行构建时不断崩溃