【问题标题】:Class java.util.Map not public or does not allow instantiation with auto generated classes in WebService类 java.util.Map 不公开或不允许在 WebService 中使用自动生成的类进行实例化
【发布时间】:2017-05-18 13:32:44
【问题描述】:

我有一个合作伙伴提供的 WSDL,基于 OTA 标准http://www.opentravel.org/OTA/2003/05

我使用 jaxws-maven-plugin 生成了一个 Java 客户端来自动生成 Java 类。 该端口可通过提供方法的 ServiceClient 获得。到这里为止,完全没有问题。

当出于测试目的,我们需要创建 WebService 的模拟实现时,问题就出现了。

我已经使用其他 WebServices 完成了此操作并且没有收到任何错误,但是对于这个我在实现接口的方法时收到以下错误:

Web 方法问题:Class java.util.Map not public 或不允许 实例化

所以我的界面是这样的:

@WebService(name = "DistributorsV1Port", targetNamespace = "http://www.opentravel.org/OTA/2003/05")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({
        ObjectFactory.class
})
public interface ServiceMock extends ServiceDispatcher<Object, Object> {

    @WebMethod(operationName = "GetMultiAvailability")
    @WebResult(name = "OTA_HotelAvailRS", targetNamespace = "http://www.opentravel.org/OTA/2003/05", partName = "response")
    public OTAHotelAvailRS getMultiAvailability(
        @WebParam(name = "OTA_HotelAvailRQ", targetNamespace = "http://www.opentravel.org/OTA/2003/05", partName = "request")
                OTAHotelAvailRQ request);

而实现如下:

@WebService(name = "DistributorsV1Port", targetNamespace = "http://www.opentravel.org/OTA/2003/05")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({
        ObjectFactory.class
})
public class ServiceMockImpl extends ServiceDispatcherImpl<Object, Object> implements ServiceMock {

    @Override
    public OTAHotelAvailRS getMultiAvailability(OTAHotelAvailRQ request) {
        return (OTAHotelAvailRS) dispatch(request);
    }
}

所以我的理解是,OTAHotelAvailRQ 的属性之一是地图,@WebService 不喜欢返回地图。但是这个类是由 jax-ws 插件自动生成的,所以我有点迷路了。

这是属性:

@XmlAnyAttribute
private Map<QName, String> otherAttributes = new HashMap();

如果更多代码有帮助,请索取您想查看的课程。

【问题讨论】:

  • Map 是一个接口,所以无法实例化它。尝试使其类HashMap&lt;QName, String&gt; otherAttributes = new HashMap()(也需要适应getter/setter)
  • 我明白了,但是这是一个由 jaxws-maven-plugin 自动生成的类,那么为什么它会生成一个无法通过 ws 发送的类呢?
  • 可以发送。我认为问题在于何时应该实例化 Map 进行解析。可能是 WS 用途,例如LinkedHashMap 保持秩序。
  • 我明白了,但是我不知道我能做什么,因为我无法控制属性定义的映射类型,因为这是我使用的外部库自动-创类。即使我更改了客户端,jaxws 插件也会在 maven install/package 等上重新生成这些类...
  • 尝试使用 &lt;jaxb:globalBindings 并定义绑定自定义文件 web-gmazza.rhcloud.com/blog/entry/enhancing-jaxb-artifacts 以使用所需的地图实现(例如始终使用 LinkedHashMap)。自己没试过

标签: java web-services soap jax-ws jaxws-maven-plugin


【解决方案1】:

问题终于通过删除解决了:

@WebService(name = "DistributorsV1Port", targetNamespace = "http://www.opentravel.org/OTA/2003/05")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({
        ObjectFactory.class
})

从实施。由于这些注释是继承的,我在那里不需要它们,然后 IntelliJ 就不会再抱怨了。

无论如何,让它们在那里应该没有问题,我猜这是 IntelliJ 警告的问题。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多