主题:请教一个关于JAVA WEB SERVICE的问题 -- 东湖珞珈
我们这边是用JAVA,客户那边是.NET。我是用SUN的JWSDP2.0(WS-COMPILE)来编译JAVA代码,生成WSDL文件。现在一个问题是:如果JAVA这边是简单的类、或者类的数组都没有问题,都可以生成正确的WSDL;但是如果是类里面还有类,或者类的数组里面还包含一个类的数组就乱了。
有没有哪位有类似的经验?
有没有谁用过JBOSS WEB SERVICE?
先谢过!
从设计的角度来讲,如果你的用户端是NET,服务器端是JAVA,用工具生成WSDL文件似乎不太可取。一般推荐的方式是先设计确定XML Schema和WSDL,然后从WSDL生成你JAVA文件。基本思想是要用XML Schema和WSDL作为Interface contract,成为不同Application之间的Mediation Layer。各个语言对基本数据类型的设定(language bindings)不同,应该避免用JAVA的数据类型来套其它语言。
可以看看Java Web Services Blueprints http://java.sun.com/blueprints/guidelines/designing_webservices/
完全可以向你那样设计。但是现在这套JAVA的系统已经运行不是一天两天了,如果CLIENT也是JAVA的,类里面套类根本不是问题。
我现在已经试验过好几个,最新的是NETBEAN的最新版本+ JBOSS组合,结果也是一样。
我说的乱了是说只能看到最外面一层的结构,如果里面有套着其他类就看不到了。
估计帮不上你了。从你说的现象来猜测,你现在已经有了一个Java-based service(EJB? POJO service? Servlet?)但是这个Service不知道是否已经是exposed as a Web Service.你现在想把它作为一个RPC Service提供给其他用户端,而且打算用J2EE Web Services而不是其他,比如Apache Axis什么的。但是你这个Service本身的RPC的Parameters或Return用了Custom Java Classes。你打算用工具从现有的Classes产生WSDL文件,然后把WSDL文件提供给NET的用户端使用。这些是猜测的哈.
不是故意挑毛病,虽然这样在技术上可以实现,但是和现在主流的设计思想不太相符,主要的问题是这个暴露了Service Implmentation Details。如果这个service重复利用价值比较高,而且可能有不同平台的用户端使用,参数什么的又需要比较复杂的数据类型,WEB SERVICE应该是用document-based instead of RPC.如果有时间,这个是需要好好考虑将来的扩展性。
如果你急着用,无所谓长期考虑按你现在的办法也行。听你的意思,你已经产生了相关的WSDL和Schema文件,并拿去给.NET客户端用来产生Web Service client.而且这些文件如果用来产生Java client没有问题.如果我猜测没错的话,你应该看看NET产生的SOAP Request对不对,可以和SOAP request gneerated by your Java Client比较一下。如果Request没问题,检查一下你的JAX-RPC Mapping files有没有问题。
客户端主要需要用XML和Javascript,服务费端就看你要干什么了
但我不想光调用他们的API,想了解整个工作原理
.net client没法读懂你java side的WSDL吧。
我做的和你刚好相反 .net 做server,JAVA(J2ME actually)做client。我想问题都是一样,俩边的stub generator只能尽可能的把WSDL里的type map成自己language里的type。至于对方有自己没有的complex type,它就没辙了。除非你自己implement一个先。至于nested type我想应该是可以的,只要里面的type都是可以map的。
try something simple like this:
class C1
{
public int i;
public C2 c2;
}
class C2
{
public string s;
}
我的JAVA CODE被编译后生成了WSDL和其他XML的文件。
我把最后的WAR装到JBOSS J2EE服务器上后,访问那个端口,看到的信息就不对了。
到这一步并不涉及.NET,就算WEB客户是JAVA也不成。
所以, 问题是WS-COMPILE没有办法正确理解类的嵌套。如果我们改变设计,没有类的数组里面再嵌类的数组,全部改成一层,就是没有嵌套的,WS-COMPILE生成的WSDL代码就是正确的。
不过按道理web service的spec是应该支持类的嵌套的啊。你说WSDL就乱了,乱成什么样了,方便贴一个看看?
http://bothack.wordpress.com/2006/05/19/a-look-at-how-ajax-works/
看一下生成的wsdl的schema部分的namespace是否正确,如果用soap的话看一下返回的全文,return是否设为正确的类型。
我最近也在做一个php类似的东东,有心得一起来切磋一下哈。
你是否知道有什么现成的工具可用?完全自己手写太费事了。
我最终要实现的JAVA类大概是这个样子的:
有CLASS A, CLASS B, CLASS C和D 。
CLASS A就是要返回给CLIENT的,其他的是服务器这一边自己用的.
class a []{
string xxx;
class b;
class d;
}
class b {
string yyy;
class c[];
}
class c {
string abc;
string xyz
}
class d {
string yuill
string foo;
}
大把呀,比如weblogic的,或者一些开源包的,都有这个生成wsdl的工具。sun做的那个是最难用的吧,我一直没学会,呵呵。等我用xfire做一个这种嵌套的看看,不过我感觉为了降低复杂程度确实不应该使用这种嵌套关系。上次做一个类似的东西,也是因为类似的原因,最后换了协议才支持。
你可以看这段生成的wsdl,不明白你乱是什么意思?
根据java代码生成这种嵌套的wsdl,是非常简单的事情,用其他客户端访问也没问题。
<xsd:complexType name="Book">
−
<xsd:sequence>
<xsd:element minOccurs="0" name="author" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="b1" nillable="true" type="ns1:b"/>
<xsd:element minOccurs="0" name="d1" nillable="true" type="ns1:ArrayOfD"/>
<xsd:element minOccurs="0" name="isbn" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="title" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
−
<xsd:complexType name="b">
−
<xsd:sequence>
<xsd:element minOccurs="0" name="c" nillable="true" type="ns1:ArrayOfC"/>
<xsd:element minOccurs="0" name="yyy" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
−
<xsd:complexType name="ArrayOfC">
−
<xsd:sequence>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="c" nillable="true" type="ns1:c"/>
</xsd:sequence>
</xsd:complexType>
−
<xsd:complexType name="c">
−
<xsd:sequence>
<xsd:element minOccurs="0" name="abc" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="xyz" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
−
<xsd:complexType name="ArrayOfD">
−
<xsd:sequence>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="d" nillable="true" type="ns1:d"/>
</xsd:sequence>
</xsd:complexType>
−
<xsd:complexType name="d">
−
<xsd:sequence>
<xsd:element minOccurs="0" name="foo" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="yuill" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
−
<xsd:complexType name="ArrayOfBook">
−
<xsd:sequence>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="Book" nillable="true" type="ns1:Book"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="BookException"/>
</xsd:schema>