Java Web服务看似不存储变量?

时间:2015-03-11 16:29:51

标签: java server concurrenthashmap

编辑:问题是双重的,第一个字典应该是静态的,我也在使用.contains()我应该使用.containsKey()

我试图做一个简单的java客户端和服务器设置,这是我所拥有的,我似乎无法找到我做的方式有任何问题,但无论何时我运行代码我得到输出:

Result = Added

Result = This word is not in the dictionary, please use the add function.

这告诉我,当我添加一个单词时,服务器不存储所做的更改地图,是否有一些非常简单的我在这里缺少?

如果被问到,我可以添加所需的更多信息。

这是我的客户代码:

public class Client {
 @WebServiceRef(wsdlLocation = 
        "http://localhost:8080/P1Server/ServerService?wsdl")

public static void main(String[] args) { 
try { 
    package1.ServerService service = new package1.ServerService(); 
    package1.Server port = service.getServerPort(); 

    String result = port.addWord("Test", "This is a test."); 
    System.out.println("Result = " + result); 

    result = port.getDefiniton("Test");
    System.out.println("Result = " + result); 
}catch(Exception ex)
{ 
    System.out.println("Gone Wrong"); 
}

这是我的相关服务器代码:

@WebService
public class Server {

private **static**ConcurrentHashMap<String,String> dictionary;    

public Server() {
    this.dictionary = new ConcurrentHashMap<>();
}

@WebMethod
public String addWord(String word, String definition){
    if(dictionary.contains(word.toLowerCase())){
        return "This word is already in the dictionary, "
                + "please use the update function.";
    }else{
        dictionary.put(word.toLowerCase(), definition);
        return "Added";
    }
}
@WebMethod
public String getDefiniton(String word){
    if(dictionary.contains(word.toLowerCase())){
        return dictionary.get(word);

    }else{
        return "This word is not in the dictionary, "
                + "please use the add function.";
    }
}

3 个答案:

答案 0 :(得分:0)

Web服务本质上是无状态的。每个Web请求都将获得自己的上下文和实例。因此,服务于port.addWord()请求的服务器实例可能与服务于port.getDefinition()的实例不同。在这种情况下,将结果放入其中的字典映射与用于检索结果的字典映射不同。

为了使其工作,数据需要以某种方式在服务器端保留。这可以通过数据库完成。或者,如果您只是为了测试目的而执行此操作,请将字典的定义更改为静态,以便所有Server实例共享相同的映射。

答案 1 :(得分:0)

词典 定义为静态变量。因此,在服务器端创建的每个Web服务实例实例都将使用相同的字典来放置/获取数据。

private static ConcurrentHashMap<String,String> dictionary;

答案 2 :(得分:0)

您的问题与Web服务无关。 问题在于你的逻辑

按如下方式修改方法:

public String addWord(String word, String definition) {
        if (dictionary.containsKey(word.toLowerCase())) {
            return "This word is already in the dictionary, "
                    + "please use the update function.";
        } else {
            dictionary.put(word.toLowerCase(), definition);
            return "Added";
        }
    }

    public String getDefiniton(String word) {
        if (dictionary.containsKey(word.toLowerCase())) {
            return dictionary.get(word.toLowerCase());

        } else {
            return "This word is not in the dictionary, "
                    + "please use the add function.";
        }
    }

它会起作用。 希望这会有所帮助。