webservice如何发布,怎么得到wsdl?

linyfei 2011-02-12 04:47:19
最近在学webservice ,按照资料自己写了一个demo(java Project)

贴上代码:
package com.entity;

import java.util.Date;

/**
* @author jmwu
*
*/
public class Customer {
private long id;
private String cusName;
private Date cusBirthday;
public long getId() {
return id;
}
/**
* @param id
*/
public void setId(long id) {
this.id = id;
}
public String getCusName() {
return cusName;
}
/**
* @param cusName
*/
public void setCusName(String cusName) {
this.cusName = cusName;
}
public Date getCusBirthday() {
return cusBirthday;
}
/**
* @param cusBirthday
*/
public void setCusBirthday(Date cusBirthday) {
this.cusBirthday = cusBirthday;
}
}

上面这个Customer类是一个方法的返回值类型继续:

服务端点接口:
package com.IService;

import com.entity.Customer;

public interface IHelloService {

Customer selectMaxAgeStudent(Customer c1,Customer c2);
Customer selectMaxLongNameStudent(Customer c1,Customer c2);
}

服务端点接口实现类:
package com.IService.Impl;

import com.IService.IHelloService;
import com.entity.Customer;

public class IHelloServiceImpl implements IHelloService {

@Override
public Customer selectMaxAgeStudent(Customer c1, Customer c2) {
if (c1.getCusBirthday().getTime()<c2.getCusBirthday().getTime())
return c1;
else
return c2;
}

@Override
public Customer selectMaxLongNameStudent(Customer c1, Customer c2) {
if (c1.getCusName().trim().length() >c2.getCusName().trim().length())
return c1;
else
return c2;
}

}

web发布:我们发布Web 服务使用的是javax.xml.ws.*包中的EndPoint 的静态方法publish()。

package com.IService.soap;

import javax.xml.ws.Endpoint;

import com.IService.Impl.IHelloServiceImpl;

public class SoapServer {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8080/helloService",new IHelloServiceImpl());
}
}

资料说我直接运行main方法就可以发布这个web服务,
之后就可以直接访问http://localhost:8080/helloService?wsdl,问题是现在我运行这段程序的时候出现空指针异常,该如何发布这个web服务呢?

异常信息:
Exception in thread "main" java.lang.NullPointerException
at com.sun.xml.internal.ws.server.EndpointFactory.getWsdlLocation(Unknown Source)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.getPrimaryWsdl(Unknown Source)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(Unknown Source)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(Unknown Source)
at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(Unknown Source)
at javax.xml.ws.Endpoint.publish(Unknown Source)
at com.IService.soap.SoapServer.main(SoapServer.java:9)



PS———资料补充:

Customer类是公开为Web 服务的接口中的参数类型和返回值,因此你需要使用JAXB 注解告诉
CXF 如何在XML和Java Object 之间处理,因为前面说过SOAP 消息格式包装的是一段XML
代码,那么无论是服务器端还是客户端在接收到SOAP 消息时都需要将XML 转化为Java
Object,在发送SOAP 消息时需要将Java Object 转化为XML。

(5.)查看WSDL:
我们访问http://127.0.0.1:8080/helloService?wsdl 地址,您会看到很长的XML 文件(由于浏
览器的问题,如果你看到的是空白页面,请查看源代码),这就是WSDL(WebService Definition
Language),对于你要访问的Web 服务,只要在其地址后加上,就可以在浏览器中查看用于
描述Web 服务的WSDL,这也是一种XML,Web 服务能够被各种编程语言书写的程序访
问就是通过WSDL 这种通用的契约来完成的。
如果你已经看到WSDL,那么表示我们的Web 服务发布成功了。你可能会差异,我们没有
借助Tomcat 这样的Web 服务器,直接运行一个main 方法是怎么发布的Web 服务呢?其实
CXF 内置了Jetty(Servlet 容器),因此你不需要将你的程序部署到Tomcat 等Web 服务器
也可以正常发布Web 服务。
...全文
37982 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ww54617 2013-01-25
  • 打赏
  • 举报
回复
美女 有问题多发布一下
ww54617 2013-01-25
  • 打赏
  • 举报
回复
美女 你这个最总解决没啊
linyfei 2012-11-07
  • 打赏
  • 举报
回复
前段时间落下这个问题了,多谢各位的解答。嗯。我这几天会再测试下,不管结论如何,到时候给分。谢谢。
SCxiaobin 2012-10-31
  • 打赏
  • 举报
回复
没有实现Serializable接口
ainimaomi 2012-08-11
  • 打赏
  • 举报
回复
看看你有没有导入CXFjar包呢
websurfer 2011-04-18
  • 打赏
  • 举报
回复
更新jdk至最近版本,或者在实现类前加上@SOAPBinding(style = SOAPBinding.Style.RPC)
//@SOAPBinding标签定义了WSDL文档中SOAP的消息协议,其中style属性对应SOAP的文档类型,可选的有RPC和DOCUMENT
magong 2011-02-16
  • 打赏
  • 举报
回复
哦?
我用的裸JDK 1.6.0,没有用其他JAR包。
linyfei 2011-02-16
  • 打赏
  • 举报
回复
所以后来我也在接口实现类做出了修改,但依旧是空指针异常。
magong 2011-02-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 linyfei 的回复:]

按照七楼的说法,我把我代码中的IHelloService接口改了下:

[/Quote]
嗯。我改的是IHelloServiceImpl类加注解。
linyfei 2011-02-16
  • 打赏
  • 举报
回复
按照七楼的说法,我把我代码中的IHelloService接口改了下:
package com.IService;

import javax.jws.WebService;

import com.entity.Customer;

@WebService
public interface IHelloService {

Customer selectMaxAgeStudent(Customer c1,Customer c2);
Customer selectMaxLongNameStudent(Customer c1,Customer c2);
}

其他的地方没变化,然后运行但是依旧是出现空指针呢。
linyfei 2011-02-16
  • 打赏
  • 举报
回复
我就加了一个junit4包,测试其他方法用的。其余就是java project自带的包jre System Library。

根据你的说法,我将jre改成了jdk1.6的包,但是运行后出现了运行时异常:

Exception in thread "main" com.sun.xml.internal.ws.model.RuntimeModelerException: runtime modeler error: Wrapper class com.IService.Impl.jaxws.SelectMaxAgeStudent is not found. Have you run APT to generate them?
at com.sun.xml.internal.ws.model.RuntimeModeler.getClass(RuntimeModeler.java:256)
at com.sun.xml.internal.ws.model.RuntimeModeler.processDocWrappedMethod(RuntimeModeler.java:567)
at com.sun.xml.internal.ws.model.RuntimeModeler.processMethod(RuntimeModeler.java:514)
at com.sun.xml.internal.ws.model.RuntimeModeler.processClass(RuntimeModeler.java:341)
at com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:227)
at com.sun.xml.internal.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:308)
at com.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:174)
at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:420)
at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:439)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:208)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:138)
at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:90)
at javax.xml.ws.Endpoint.publish(Endpoint.java:170)
at com.IService.soap.SoapServer.main(SoapServer.java:12)
magong 2011-02-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 linyfei 的回复:]
资料说我直接运行main方法就可以发布这个web服务,
之后就可以直接访问http://localhost:8080/helloService?wsdl,问题是现在我运行这段程序的时候出现空指针异常,该如何发布这个web服务呢?
[/Quote]
你顶楼的帖子中既提到了JWS也提到了CXF,这两个环境下发布WebService当然会不一样。
我用你的代码,
用JWS可以正常发布并访问到wsdl文本。
唯一做的修改是在行

public class IHelloServiceImpl implements IHelloService {

上加了@WebService注解。
宁波朱超 2011-02-14
  • 打赏
  • 举报
回复
EJB3发布WS的话那就简单了直接类上加注解@WebService,然后生成JAR扔进EJB容器就可以了。
  • 打赏
  • 举报
回复
3 楼所说的只是一个简单的端点发布。没有考虑到在 WebService 中如何实现数字签字、SOAP XML 校验、异步 Web 服务等很多的东西!
  • 打赏
  • 举报
回复
WebService 可是一个很复杂的东西!
linyfei 2011-02-14
  • 打赏
  • 举报
回复
没人理我?
handong890 2011-02-14
  • 打赏
  • 举报
回复
webservice还用学么。。都是标准化的东西无非就是把service层暴露成webservice供异构语言平台使用
暴露有现成工具,框架,调用也有现成工具,框架
我用的是spring 集成 xfire 暴露webservice 直接加注解

@Service("xxService")
@WebService(serviceName = "xxService", endpointInterface = "xx.xx.xx.xxService")

通过 项目名/xfire/ 访问所有暴露的webService如 http://127.0.0.1:8080/xxx/xfire

发布的话把url或下载下来的xml文件给调用方自动生成调用代码即可

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧