生成WebService构件时遇到问题
问题描述:
我在为Web服务生成消息和响应构件时遇到了一些问题。我在尝试时遇到了cmd错误:生成WebService构件时遇到问题
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正在使用无效的构造函数:包访问构造函数,因此为了公开您的服务,您需要添加一个公共无参数构造函数。
由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构造的另一种方式,也许委托给另一个POJO需要参数构造一个对象的实例。