java webservice如何发布
使用JAX-WS发布WebService
在Java中,JAX-WS是创建和发布WebService的标准API。以下是通过JAX-WS发布WebService的步骤:
创建一个Java类并添加@WebService注解
import javax.jws.WebService;
@WebService
public class HelloService {
public String sayHello(String name) {
return "Hello, " + name + "!";
}
}
使用Endpoint类发布服务
import javax.xml.ws.Endpoint;
public class WebServicePublisher {
public static void main(String[] args) {
String address = "http://localhost:8080/hello";
Endpoint.publish(address, new HelloService());
System.out.println("WebService published at: " + address);
}
}
使用Spring Boot发布WebService
Spring Boot简化了WebService的发布过程:
添加依赖到pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
创建服务端点
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
@Endpoint
public class GreetingEndpoint {
private static final String NAMESPACE_URI = "http://example.com/greeting";
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "greetingRequest")
@ResponsePayload
public GreetingResponse greeting(@RequestPayload GreetingRequest request) {
GreetingResponse response = new GreetingResponse();
response.setGreeting("Hello, " + request.getName() + "!");
return response;
}
}
配置WebService

import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ws.config.annotation.EnableWs;
import org.springframework.ws.transport.http.MessageDispatcherServlet;
@EnableWs
@Configuration
public class WebServiceConfig {
@Bean
public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(ApplicationContext context) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(context);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean<>(servlet, "/ws/*");
}
}
使用CXF框架发布WebService
Apache CXF是一个功能丰富的WebService框架:
添加CXF依赖
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.4.0</version>
</dependency>
配置和发布服务
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
public class CxfPublisher {
public static void main(String[] args) {
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(HelloService.class);
factory.setAddress("http://localhost:8080/hello");
factory.create();
System.out.println("CXF WebService published");
}
}
生成WSDL文件
对于需要WSDL的场景,可以使用以下方法:

使用wsgen工具生成WSDL
wsgen -cp . -wsdl -r . -d . -s . com.example.HelloService
在Spring WS中自动生成WSDL
@Bean(name = "greeting")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema greetingSchema) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("GreetingPort");
wsdl11Definition.setLocationUri("/ws");
wsdl11Definition.setTargetNamespace("http://example.com/greeting");
wsdl11Definition.setSchema(greetingSchema);
return wsdl11Definition;
}
@Bean
public XsdSchema greetingSchema() {
return new SimpleXsdSchema(new ClassPathResource("greeting.xsd"));
}
测试WebService
使用SOAPUI或Postman测试发布的WebService
通过浏览器访问WSDL
http://localhost:8080/ws/greeting.wsdl
使用Java客户端测试
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;
public class WebServiceClient {
public static void main(String[] args) throws Exception {
URL wsdlUrl = new URL("http://localhost:8080/hello?wsdl");
QName serviceName = new QName("http://example.com/", "HelloService");
Service service = Service.create(wsdlUrl, serviceName);
HelloService hello = service.getPort(HelloService.class);
System.out.println(hello.sayHello("World"));
}
}






