C# 调用 java webservice 的问题
前一段时间一直被一个 c#调用 Java web service的问题困扰。
http://www.cnitblog.com/reene/archive/2007/06/29/29217.html
在网上一直找不到答案,后来在国外的一个论坛上有人提醒可能是命名空间的原因,摸索以后终于顺利解决这个问题。特别把它记下以后方便。
问题:
如果用c#调用java 的 webservice 时,发现调用返回值为基本类型(如 xsd:string xsd:int)的服务能过正常返回,而调用返回复杂类型如自定义对象时却返回 null,同时抓包发现服务器段明明已经正常答复soap消息。 就需要考虑命名空间的问题。
在我碰到的问题中,由于我把用来返回结果的bean 单独放到一个 xxx.xxx.bean 包中,而把webservice 的文件放在 xxx.xxx.service包中,在用wtp生成 webservice 服务时就把它们放到不同的命名空间中去了。
解决方案:
把用来的bean文件放置到与service同一个package中,这样用wtp lomboz之类工具生成时就直接会在一个命名空间中。
--本人备忘
最近在一个项目中,就遇到了这个问题,此文对我帮助很大,先谢谢这会兄弟了。另附一小段代码,备忘一下:
Java端的webservice中saveUser(JafUser user)方法中的JafUser类代码如下:
- /**
- *
- * @author lixy 2006-12-14 10:16:04
- *
- */
- public class JafUser implements java.io.Serializable {
- // Fields
- private String userId;
- private String userName;
- private Integer regionId;
- // Constructors
- /** default constructor */
- public JafUser() {
- }
- public Integer getRegionId() {
- return regionId;
- }
- public void setRegionId(Integer regionId) {
- this.regionId = regionId;
- }
- public String getUserId() {
- return userId;
- }
- public void setUserId(String userId) {
- this.userId = userId;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String toString() {
- StringBuffer sb = new StringBuffer("[ ");
- sb.append("userId = "+this.userId).append(",");
- sb.append("userName = "+this.userName).append(",");
- sb.append("regionId = "+this.regionId).append(" ]");
- return sb.toString();
- }
- }
- ConsoleApplication1.com.lixy.ws.UserServiceEx manager = new ConsoleApplication1.com.lixy.ws.UserServiceEx();
- JafUser user = new JafUser();
- user.userId = "lixy01";
- user.userName = "lixiangyang01";
- user.regionId = 4301;
- user.regionIdSpecified = true;
- String result = manager.saveUser(user);
- Console.WriteLine("Result = " + result);
- Console.ReadLine();
regionIdSpecified 虽然不是JafUser对象()中的属性,但是在测试程序时,发现只有将user.regionIdSpecified设为 true,regionId才被发送到webservice端。望...