我们还没有使用Webservices(实际上我们是JavaEE基础架构的新手),我将JAX-WS视为Web服务格式,但我不确定是否还有新出现的更好的解决方案,我们可以尝试.我们可以选择我们想要使用的标准,并且将使用Web服务的客户也将使用该标准.
非常感谢任何想法.
我正在用PHP写一个用肥皂消费者写一个用Java编写的ws(Jax ws).webservice导出一个函数listRooms(),它返回一个复杂数据类型Room的数组,它包含一个id(64位长)和一个描述(字符串).现在每当我使用SoapClient使用web服务时,id都会转换为float(因为PHP中没有64位整数),我想避免它.因为我需要房间id来使用其他Web服务,我宁愿避免这种隐式转换浮动,将其保存在字符串中.
有谁知道如何解决这个问题?
我想使用JAXWS在java中构建一个soap客户端.我在谷歌搜索但没有找到任何相关信息.这是我尝试过的:
QName serviceName = new QName("urn:Site", "Site");
QName portName = new QName("urn:Site", "Server_HandlerPort");
String endpointAddress = "http://myhost/url/soap";
Service service = Service.create(serviceName);
service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);
Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE);
BindingProvider bp = (BindingProvider) dispatch;
MessageFactory factory = ((SOAPBinding) bp.getBinding()).getMessageFactory();
SOAPMessage request = factory.createMessage();
SOAPHeader header = request.getSOAPHeader();
SOAPBody body = request.getSOAPBody();
QName payloadName = new QName("session");
SOAPBodyElement payload = body.addBodyElement(payloadName);
SOAPMessage reply = null;
try {
reply = dispatch.invoke(request);
} catch (WebServiceException wse){
wse.printStackTrace();
}
body = reply.getSOAPBody();
QName …Run Code Online (Sandbox Code Playgroud) 我已经使用JAX-WS 2.1.7为旧的Web服务生成了源代码。当我调用此服务时,生成的肥皂消息如下所示:
<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
<env:Header>
</env:Header>
<env:Body>
...
</env:Body>
</env:Envelope>
Run Code Online (Sandbox Code Playgroud)
但是旧的Web服务仅接受以下格式:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
...
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
如您所见,前缀是“ soap”而不是“ env”,并且没有标题,所以我收到一个错误消息,抱怨“ soap:Body”是必需的。我无法更改旧的Web服务,需要发送兼容的肥皂消息。如何将前缀更改为“ soap”并删除“ Header”?
我被迫从我的网络服务中删除CXF.为了删除对身份验证的任何依赖性,我设置了一个HttpAuthSupplier类来处理基本身份验证.
public class ExchangeAuthSupplier implements HttpAuthSupplier{
@Override
public boolean requiresRequestCaching() {
return false;
}
@Override
public String getAuthorization(AuthorizationPolicy authPolicy, URL url, Message message, String fullHeader) {
// Lookup authentication information and return appropriate header
}
}
Run Code Online (Sandbox Code Playgroud)
我正在试图弄清楚如何使用常规JAX-WS API和Spring来做类似的事情......
当我尝试启动这个简单的Web服务时,我是JAX-WS的新手:
接口:
package ws;
import java.util.HashMap;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface IBasket {
@WebMethod public abstract void addItem(int productId, int count);
@WebMethod public abstract HashMap<Integer, Integer> getBasketMap();
}
Run Code Online (Sandbox Code Playgroud)
实施班级:
package model;
import java.util.HashMap;
import javax.jws.WebService;
import ws.IBasket;
@WebService(endpointInterface = "ws.IBasket")
public class Basket implements IBasket {
private HashMap<Integer, Integer> basket;
public Basket() {
this.basket = new HashMap<Integer, Integer>();
}
@Override
public void addItem(int productId, int count) {
int currentCount = 0;
if (basket.containsKey(productId)) {
currentCount = basket.get(productId);
} …Run Code Online (Sandbox Code Playgroud) 我正在使用JAX-WS开发一个项目.
当我使用@WebServiceWSDL 注释我的端点类时,在控制台中标记为
.../<context-root>/XXXService?wsdl
Run Code Online (Sandbox Code Playgroud)
当我添加@Stateless这些端点时,WSDL没有在控制台中标记,实际地址是
.../XXXService/XXXEndpoint?wsdl
Run Code Online (Sandbox Code Playgroud)
这是正常的还是预期的?
更新
进一步的读者.
我找不到任何解决方案.我决定不使用混合@Stateless+ @WebService.我将这些分开@EJB并@WebServices进行清晰的模块分离.
在编写JAXWS客户端时,这是我过去使用的:
// CALL SERVICE
EPaymentsService bPayService = new EPaymentsService();
ServiceInterface stub = bPayService.getPort();
BindingProvider bp = (BindingProvider) stub;
Map<String, Object> rc = bp.getRequestContext();
String endPointUrl = propFile.getString(Constants.END_POINT_URL);
rc.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endPointUrl);
// RESPONSE
ResponseMessage resMessage = stub.sendMessage(reqMessage);
Run Code Online (Sandbox Code Playgroud)
在我的代码中,ServiceInterface不会扩展BindingProvider.So为什么我们在转换时不会出错
BindingProvider bp = (BindingProvider) stub;
Run Code Online (Sandbox Code Playgroud) 例如,我必须创建一个具有以下详细信息的Web服务:
Web服务名称是WS1方法名称是initiantBatchProcess(字符串状态,整数BatchID)
我已经尝试过使用一个参数进行以下操作,但是如何使用两个参数进行操作并在webservice / soap的响应中返回它
public class WS1
{
int status;
@WebMethod(operationName="status")
public int status(int status) {
return status;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在用Java调用Web服务。它运行良好,但我也想设置连接超时。
我的代码:
URL urlwsdl = new URL ("file://" + wsdl);
QName qn = new QName("http://myserver/myservice", "MyService");
port = new TimeSeriesService_Service (urlwsdl, qn).getMyServicePort ();
BindingProvider prov = (BindingProvider) port;
prov.getRequestContext ().put (BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://server1/myservice");
prov.getRequestContext ().put (BindingProvider.USERNAME_PROPERTY, "max");
prov.getRequestContext ().put (BindingProvider.PASSWORD_PROPERTY, "secret");
QueryRequest1 req = new QueryRequest1 ();
QueryResponse1 res = port.queryRequest1 (req); // *** TIMEOUT for ~2 minutes
Run Code Online (Sandbox Code Playgroud)
我在互联网上找到了一些帖子。他们像我对http-auth一样使用绑定提供程序的上下文。
例如
prov.getRequestContext ().put ("com.sun.xml.ws.request.timeout", 1000000);
Run Code Online (Sandbox Code Playgroud)
但是它们使用的是我在命名空间中没有的对象。
例如
sun.net.client.defaultConnectTimeout
com.sun.xml.ws.connect.timeout
com.sun.xml.ws.request.timeout
Run Code Online (Sandbox Code Playgroud)
我有sun.net但没有.client。我有com.sun.xml,但没有.ws。
我有一个简单的Java JDK(1.7,Debian 8.3、64位),可以编译和运行我的Web服务,WebClient以及wsimport。没有安装netbeans,也没有安装jboss。
有什么想法可以设置超时时间吗?感谢帮助!克里斯