我在为Web服务生成消息和响应工件时遇到了一些麻烦。我尝试时在cmd中遇到此错误:


  C:\ Users \ KingMarkMcC \ workspace \ WebServiceJX> wsgen -cp -keep。
  WebServiceImp选项“ -classpath”需要一个参数


这是我的WebServiceInterface

package CacheServer;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

@WebService
@SOAPBinding(style= Style.DOCUMENT)
public interface WebServiceInterface {

    @WebMethod Object get(Object k);
    @WebMethod void put(Object k, Object v);
    @WebMethod void remove(Object k);
    @WebMethod void flush();
    @WebMethod int size();
}


在我的WebService实施下面
    包CacheServer;

import java.util.LinkedHashMap;
import java.util.Map;

import javax.jws.WebService;


@WebService(endpointInterface = "CacheServer.WebServiceInterface")

public class WebServiceImp implements WebServiceInterface{

CacheDataStruct cache;

WebServiceImp(int i){
    cache = new CacheDataStruct(i);
}

//Getting from Cache
@Override
public Object get(Object k){
    System.out.println("GET REQUESTED");
    return getter(k);
}
private Object getter(Object k){
    return cache.get(k);
}

//Putting into Cache
@Override
public void put(Object k, Object v){
    System.out.println("PUT REQUESTED");
    putter(k,v);
}
private void putter(Object k, Object v){
    cache.put(k, v);
}

//Removing from Cache
@Override
public void remove(Object k){
    System.out.println("REMOVE REQUESTED");
    remover(k);
}
private void remover(Object k){
    cache.remove(k);
}

//Getting size of Cache
@Override
public int size(){
    System.out.println("SIZE REQUESTED");
    return sizer();
}
private int sizer(){
    return cache.size();
}

//Flushing Cache
@Override
public void flush(){
    System.out.println("FLUSH REQUESTED");
    flusher();
}
private void flusher(){
    cache.flush();
}

class CacheDataStruct extends LinkedHashMap<Object,Object>{
    private static final long serialVersionUID = -8892618408950826874L;
    public final int CACHESIZE;
    private final static float loadFactor =0.75f;

    protected boolean removeEldestEntry(Map.Entry<Object, Object> eldest) {
        return size() > CACHESIZE;
    }

    public CacheDataStruct(int cacheSize){
        super(cacheSize,loadFactor,true);
        this.CACHESIZE=cacheSize;
    }

    void flush(){
        clear();
        System.out.println("Cache has been cleared.");
    }
}
}


任何有关生成工件的帮助将不胜感激!

最佳答案

经过分析,我发现这里的第一个挑战在于您的服务实现Bean(SIB)WebServiceImp。您的SIB使用的是无效的构造函数:包访问构造函数,因此,要公开服务,您需要添加Public No-arg构造函数。


  根据JSR 181的定义,该类带有javax.jws.WebService注释
  必须具有默认的公共构造函数。 SIB班级必须是顶级
  级别类或静态内部类。


SIB构造函数的示例:

    public WebServiceImp() {}
    public WebServiceImp(int i) {
        cache = new CacheDataStruct(i);
    }


在完成上述更改之后,并且可能在编译之后(javac CacheServer / *。java),您可以运行wsgen命令或简单地运行以下命令(在src文件夹中):

     wsgen -cp "." -wsdl CacheServer.WebServiceImp


还可以找到另一种传递参数的方法,而不是在SIB中使用构造函数,也许将需要arg构造函数的对象的实例委托给另一个POJO。

关于java - 无法生成WebService工件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40487074/

10-10 18:51