Явно уеб услугата на 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
Не, не е необходимо да е статичен. Ще имате само един екземпляр от вашия клас сървър. И тъй като използвате ConcurrentHashMap за вашия речник, вие сте доста сигурни. - person jithin iyyani; 11.03.2015

Уеб услугите са без състояние по природа. Всяка уеб заявка ще получи свои собствени контексти и екземпляри. Така че екземплярът на сървъра, който обслужва заявката port.addWord(), може да бъде различен от този, който обслужва port.getDefinition(). В този случай картата на речника, в която е поставен резултатът, е различна от тази, използвана за извличане на резултатите.

За да работи това, данните трябва да бъдат запазени по някакъв начин от страната на сървъра. Това може да стане чрез база данни. Или, ако правите това само за тестови цели, променете дефиницията на речника да бъде статична, така че всички копия на сървъра да споделят една и съща карта.

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: Вие сте напълно прав. Но все пак уеб услугите не са без състояние. Те могат да бъдат без гражданство или без гражданство, но да, без гражданство са по-често срещани. По-често срещано до степен, че рядко бихте попаднали на състояние. - 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