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

我是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 getTeams() { return utils.getTeams(); } @WebMethod public String getDummyTeams() { return "Hi"; } } 

如你所见,我有3种方法。 现在,如果我只是保留getDummyTeams并要求eclipse创建一个WebService,那么我没有任何问题。 但是当我尝试添加剩余的2个方法时, public Team getTeam(String name)public List getTeams()然后在创建webservice时我收到错误:

服务类“helloservice.endpoint.Teams”不符合JAX-RPC 1.1规范的一个或多个要求,可能无法正确部署或运行​​。 通过服务类“helloservice.endpoint.Teams”使用的值类型“helloservice.endpoint.Team”上的字段或属性“players”具有JAX不支持的数据类型“java.util.List” -RPC 1.1规范。 该类型的实例可能无法正确序列化或反序列化。 可能导致数据丢失或Web服务完全失败。

这是我的Team课程:

 @XmlRootElement public class Team implements Serializable{ private List players; private String name; public Team() { } public Team(String name, List players) { setName(name); setPlayers(players); } // Setter & Getter methods } 

你能帮我解决一下这个问题吗? 我想使用java.util.List 。 在创建基于SOAP的Web服务时,是否有任何设置我必须在eclipse中更改以使用集合?

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

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

您可能希望继续使用JAX-RPC 1.1的原因 :…如果要发送SOAP编码消息或创建RPC /编码样式WSDL。

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

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

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

每种风格都有优点和缺点。 最重要的一点是以下说法:

虽然它是合法的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 Web服务一样。)

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

             

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

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

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

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

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

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

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

改变你的方法就像

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

并且你的getTeams()实现应该与此匹配。