服务类不符合JAX-RPC 1.1规范的一个或多个要求,并且可能无法正确部署或运行

时间:2015-06-02 20:32:00

标签: java eclipse web-services soap

我是Java Webservices的新手,目前我正在尝试创建一个简单的基于SOAP的Web服务,但在创建它时遇到了问题。

这是我的webservice类:

@WebService
public class Teams {
    private TeamsUtility utils;

    public Teams() { 
       utils = new TeamsUtility(); 
       utils.make_test_teams();
    }

    @WebMethod
    public Team getTeam(String name) { return utils.getTeam(name); }

    @WebMethod
    public List<Team> getTeams() { return utils.getTeams(); }

    @WebMethod
    public String getDummyTeams() { return "Hi"; }
}

正如你所看到的,我在这里有3种方法。现在,如果我只保留getDummyTeams并要求eclipse创建WebService,那么我没有问题。但是,当我尝试添加剩余的两种方法public Team getTeam(String name)&amp; public List<Team> getTeams()然后在创建webservice时出现错误:

  

服务类&#34; helloservice.endpoint.Teams&#34;不符合一个   或更多JAX-RPC 1.1规范的要求,但可能不是   部署或正常运行。场地或财产&#34;球员&#34;在...上   价值类型&#34; helloservice.endpoint.Team&#34;通过服务类使用   &#34; helloservice.endpoint.Teams&#34;有一个数据类型,&#34; java.util.List&#34;,那   JAX-RPC 1.1规范不支持。实例   类型可能无法正确序列化或反序列化。数据丢失或   可能会导致Web服务完全失败。

这是我的Team课程:

@XmlRootElement
public class Team implements Serializable{
    private List<Player> players;
    private String name;

    public Team() {
    }

    public Team(String name, List<Player> players) {
        setName(name);
        setPlayers(players);
    }
// Setter & Getter methods
}

您能帮我解决一下这个问题吗?我想使用java.util.List。在创建基于SOAP的Web服务时,我是否需要在eclipse中更改以使用集合?

5 个答案:

答案 0 :(得分:4)

这不是对这个问题的直接回应。但是,我想指出你可能根本不考虑使用JAX-RPC。

首先,JAX-RPC是一个旧的API,已被JAX-WS取代。

  

Reasons you may want to stay with JAX-RPC 1.1:...如果要发送SOAP编码消息或创建RPC /编码样式WSDL。

这引出了我们的问题“什么是 RPC编码的 WSDL样式?”

WSDL文件包含webservice方法的定义。并且有4种方式/样式来定义这些方法:

  • RPC /编码
  • RPC /文字
  • 文档/编码
  • 文档/文字

Each style has advantages and disadvantages.最重要的是以下评论:

  

虽然它是合法的WSDL,但RPC / encoded不符合WS-I。

WS-I代表“webservice互操作性”。因此,正如引言所阐明的那样,即使JAX-RPC支持RPC /编码的WSDL文件,也不意味着它与其他RPC /编码技术(例如用PHP编写的Web服务)兼容。 Java和PHP之间的JAX-RPC Web服务最初可能起作用,但有时会在特定情况下中断。 所以教训是:避免使用RPC /编码的WSDL文件。这正是JAX-WS不支持它们的原因。

不幸的是,有时你没有选择(例如,另一家公司提供web服务)如果它是RPC /编码的WSDL文件,那么你将无法使用JAX-WS。 如果托管的Web服务也是用Java编写的,那么您可能会冒险使用JAX-RPC。如果它是用其他语言写的,那么我就不会冒风险。当发生这种情况时,你最好编写一个自定义处理程序。 (您仍然可以安全地使用JAXB(Java Xml Binding)来使用注释执行(un)编组(从/到xml的转换),就像使用JAX-WS webservices一样。)

但是你怎么知道它是否是RPC /编码的WSDL文件?您只需在文本编辑器中打开它,然后查找绑定标记。以下示例是RPC / literal样式的WSDL文件。因此,您可以将JAX-WS用于此Web服务。

<binding name="MyService" type="tns:MyService">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
  <operation name="method">
    <soap:operation soapAction=""/>
    <input>
      <soap:body use="literal" .../>
    </input>
    <output>
      <soap:body use="literal" .../>
    </output>
  </operation>
</binding>

当您定义自己的Web服务时,可以通过使用@SOAPBinding(style=Style.RPC, use=Use.LITERAL)为您的类添加注释来选择WSDL样式。

混乱的来源: JAX-RPC和JAX-WS都使用SOAP。还有一个名为XML-RPC的东西,它是旧标准(在SOAP之前)。 但是JAX-RPC不使用XML-RPC另一方面,SOAP有时被称为“XML based RPC”。

答案 1 :(得分:0)

我认为JAX RPC 1.1不支持List作为服务bean类的数据类型。请改用Array。你可以看到类似问题的this答案

答案 2 :(得分:0)

集合类未在Java Web服务中使用的标准化的主要原因是它们是松散类型的集合。在没有来自用户的重要附加数据的情况下,不可能将Java集合映射到定义良好的模式,并清除运行时的规则以序列化和反序列化集合的元素。

使用Java数组而不是集合来表示WSDL中的元素序列。 Java数组是强类型的,因此映射到强类型Schema和从强类型Schema映射,产生可互操作的WSDL和SOAP流量,具有明确的规则,用于反序列化和与Java之间的序列化。 请参阅link

答案 3 :(得分:0)

JAX-RPC 1.1规范提供了一个名为可插入序列化器和反序列化器的东西来支持集合类。

答案 4 :(得分:0)

JAX-RPC 1.1规范未指定java.util.List对象与XML之间的明确映射,因为您要返回java.util.List类型。

改变你的方法,如

public Team[] getTeams() { return utils.getTeams(); }

您的getTeams()实施应与此相符。