Веб-служба Java, похоже, не хранит переменную?

РЕДАКТИРОВАТЬ: проблема была двоякой: первый словарь должен быть статическим, а также я использовал .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.";
    }
}

person user4301818    schedule 11.03.2015    source источник


Ответы (3)


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

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

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

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

person jithin iyyani    schedule 11.03.2015
comment
Действительно ? Есть ли причина, по которой это работает, как вы предлагаете? - person Don Srinath; 11.03.2015
comment
Проверьте его логику. Он пытается это сделать. - person jithin iyyani; 11.03.2015
comment
да, я только что пропустил [contains] и [containsKey]. @jitsonfire, хорошая мысль. Тем не менее словарь должен быть статическим. - person Don Srinath; 11.03.2015
comment
Нет, это не обязательно должно быть статичным. У вас будет только один экземпляр вашего класса Server. И поскольку вы используете ConcurrentHashMap для своего словаря, вы в значительной степени в безопасности. - person jithin iyyani; 11.03.2015

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

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

person Ali Cheaito    schedule 11.03.2015
comment
Веб-сервисы не имеют гражданства по своей природе? кто сказал, что это всегда правда? есть также сервисы с отслеживанием состояния. stackoverflow.com/questions/94660/stateful-web-services - person Mukul Goel; 11.03.2015
comment
Я изменил словарь на статический, но у меня все еще есть та же проблема, NetBeans теперь также выдает предупреждение о том, что переменная словаря может быть окончательной - person user4301818; 11.03.2015
comment
Веб-сервисы @MukulGoel в целом не имеют гражданства. Я уверен, что вы можете найти некоторые веб-службы с сохранением состояния, но все, с которыми я работал, не имеют состояния, и для этого есть веские причины, в первую очередь то, что протокол HTTP сам по себе не имеет состояния (прочтите ответ на вопрос, с которым вы связались ). - person Ali Cheaito; 11.03.2015
comment
@ user4301818 См. ответ jitsonfire выше. В вашей логике есть изъян (используйте word.toLowerCase () для получения из словаря). Однако вам все равно нужно, чтобы карта была статической. - person Ali Cheaito; 11.03.2015
comment
@AliCheaito: Вы совершенно правы. Но все же веб-сервисы не являются апатридами. Они могут быть без гражданства или с отслеживанием состояния, но да, они более распространены. Чаще встречается в том смысле, что вы редко встретите stateful. - person Mukul Goel; 11.03.2015

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

private static ConcurrentHashMap<String,String> dictionary;
person Don Srinath    schedule 11.03.2015
comment
Я изменил словарь на статический, но у меня все еще есть та же проблема, NetBeans теперь также выдает предупреждение о том, что переменная словаря может быть окончательной - person user4301818; 11.03.2015
comment
да, вы можете сделать его [окончательным], так как он никогда не будет переназначен. - person Don Srinath; 11.03.2015