1

この単純な Web サービスを開始しようとするとき、私は JAX-WS を初めて使用します。

インターフェース:

package ws;

import java.util.HashMap;
import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public interface IBasket {
    @WebMethod public abstract void addItem(int productId, int count);  
    @WebMethod public abstract HashMap<Integer, Integer> getBasketMap();
}

実装クラス:

package model;

import java.util.HashMap;
import javax.jws.WebService;
import ws.IBasket;

@WebService(endpointInterface = "ws.IBasket")
public class Basket implements IBasket {

    private HashMap<Integer, Integer> basket;

    public Basket() {
        this.basket = new HashMap<Integer, Integer>();
    }

    @Override
    public void addItem(int productId, int count) {
        int currentCount = 0;
        if (basket.containsKey(productId)) {
            currentCount = basket.get(productId);
        }
        basket.put(productId, currentCount + count);
    }

    @Override
    public HashMap<Integer, Integer> getBasketMap() {
        return basket;
    }
}

出版社:

package endpoint;

import javax.xml.ws.Endpoint;
import model.Basket;

public class WSPublisher {

    public static void main(String[] args) {
        Endpoint.publish("http://localhost:8080/WS/Basket",new Basket());
    }
}

次のスタックトレースを取得しています:

Exception in thread "main" javax.xml.ws.WebServiceException: class ws.jaxws.GetBasketMapResponse do not have a property of the name return
    at com.sun.xml.internal.ws.server.sei.EndpointResponseMessageBuilder$DocLit.<init>(EndpointResponseMessageBuilder.java:196)
    at com.sun.xml.internal.ws.server.sei.EndpointMethodHandler.createResponseMessageBuilder(EndpointMethodHandler.java:191)
    at com.sun.xml.internal.ws.server.sei.EndpointMethodHandler.<init>(EndpointMethodHandler.java:97)
    at com.sun.xml.internal.ws.server.sei.SEIInvokerTube.<init>(SEIInvokerTube.java:72)
    at com.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:208)
    at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:498)
    at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:246)
    at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:170)
    at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:113)
    at javax.xml.ws.Endpoint.publish(Endpoint.java:240)
    at endpoint.WSPublisher.main(WSPublisher.java:14)
Caused by: javax.xml.bind.JAXBException: return is not a valid property on class ws.jaxws.GetBasketMapResponse
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getElementPropertyAccessor(JAXBContextImpl.java:966)
    at com.sun.xml.internal.ws.server.sei.EndpointResponseMessageBuilder$DocLit.<init>(EndpointResponseMessageBuilder.java:193)
    ... 10 more

これを解決する方法はありますか?

4

2 に答える 2

7

OK、この問題の解決策を見つけました。次を参照してください。

配列を値として PHP soapclient リクエストに渡すにはどうすればよいですか?

HashMap の戻り値についても同じです。JAXB は HashMaps をパラメーター/戻り値として処理できません。おそらくそれらが汎用的であるためです。

代わりに、HashMap<Integer, Integer> のラッパー クラスが必要です。

public class HashMapWrapper {
    
    private HashMap<Integer, Integer> basketMap;
    
    public HashMapWrapper(HashMap<Integer, Integer> basketMap) {
        this.setBasketMap(basketMap);
    }

これを戻り値として使用します。

于 2012-12-09T11:41:16.627 に答える
2

Metro を JAX-WS プロバイダーとして使用していますか? その場合は、Document スタイルを次のように RPC に設定してみてください。この注釈は、@WebService 注釈の後に配置する必要があります。;

@SOAPBinding(style = Style.RPC)
于 2012-12-09T01:15:57.170 に答える