2015-03-11 1 views
0

EDIT: проблема была в два раза, первый словарь должен быть статическим, а также я использовал .contains(), где я должен был использовать .containsKey()Веб-служба Java, похоже, не сохраняет переменную?

Я пытаюсь сделать простой 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."; 
    } 
} 

ответ

0

Ваша проблема связана с webservice. вопрос с вами логики

Измените методы следующим образом:

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."; 
     } 
    } 

Он будет работать. Надеюсь, это поможет.

+0

Действительно? Любая причина для этого, как вы предлагаете? – Don

+0

Проверьте его логику. Он пытается это сделать. – jitsonfire

+0

Это работало, как я использовал. содержит() нет .containsKey() – user4301818

0

Веб-сервисы являются лицами без гражданства по своей природе. Каждый веб-запрос получит свои собственные контексты и экземпляры. Таким образом, экземпляр сервера, обслуживающий запрос port.addWord(), может отличаться от экземпляра, который обслуживал port.getDefinition(). В этом случае карта словаря, в которую был помещен результат, отличается от той, которая использовалась для получения результатов.

Для того, чтобы это сработало, данные должны быть сохранены как-то на стороне сервера. Это можно сделать через базу данных. Или, если вы просто делаете это в целях тестирования, измените определение словаря на статичное, чтобы все экземпляры сервера использовали одну и ту же карту.

+0

Веб-службы являются лицами без гражданства по своей природе? кто говорит, что это правда? есть также службы с сохранением состояния. http://stackoverflow.com/questions/94660/stateful-web-services –

+0

Я изменил словарь на статичный, но у меня все еще есть та же проблема, теперь NetBeans дает предупреждение о том, что переменная словаря может быть окончательной – user4301818

+0

@MukulGoel Web-сервисы в целом, являются лицами без гражданства. Я уверен, что вы можете найти некоторые полнофункциональные веб-службы, но каждый, с которым я работал, не имеет гражданства, и для этого есть веские причины, в первую очередь, что протокол HTTP сам по себе является апатридом (прочитайте ответ на вопрос, который вы связали с). –

0

словарь как статическая переменная. Чтобы каждый экземпляр экземпляров веб-сервисов, созданных на стороне сервера, использовал тот же словарь для ввода/получения данных.

private static ConcurrentHashMap<String,String> dictionary; 
+0

Я изменил словарь на статичный, но у меня все еще есть та же проблема. Теперь NetBeans также дает предупреждение о том, что переменная словаря может быть окончательной – user4301818

+0

yah, вы можете сделать ее [final], поскольку она никогда не будет переназначена. – Don