2

JAX-WS の return simple String[] に問題があります。@WebMethod があります。

    public String[] getUserInfo() {
        MessageContext mc = wsContext.getMessageContext();
        HttpSession session = ((javax.servlet.http.HttpServletRequest) mc.get(MessageContext.SERVLET_REQUEST)).getSession();
        String username = (String) session.getAttribute("username");
        String[] userInfo = new String[4];
        Session hibSess = HibernateUtil.getSessionFactory().openSession();
        hibSess.beginTransaction();
        String query = "select id, login, email, active from User as user where user.login ='Mrl'";
        Query queryResult = hibSess.createQuery(query);
        java.util.List user = queryResult.list();
        int i;
        int j;
        Object object = null;
        for (i = 0; i < user.size(); i++) {
            Object[] obj = (Object[]) user.get(i);
            for (j = 0; j < obj.length; j++) {
                userInfo[j] = obj[j].toString();
            }
        }
        /* Here is the moment when I check the array on server side - it's fine */
        System.out.println("US:"+user.size() + ", userInfo length" +userInfo.length+"\n"+userInfo[0]
                +"\n"+userInfo[1]+"\n"+userInfo[2]+"\n"+userInfo[3]);
        return userInfo;
    }

配列には 4 つの要素が必要です。サーバー上には 4 つの要素があり、正しいデータが含まれています。

クライアントでその配列を取得しようとすると、エラーは発生しません。空の 1 要素の配列を取得するだけです。

クライアントコードは次のとおりです。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getUserInfo")
public class GetUserInfo {
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getUserInfoResponse", propOrder = {
    "_return"
})
public class GetUserInfoResponse {
@XmlElement(name = "return")
protected String[] _return;

public String[] getReturn() {
    return _return;
}

public void setReturn(String[] value) {
    this._return = value;
}

}

そして、私が使用するクライアントを実行するために:

SimpleWebService proxy = new SimpleWebServiceService().getSimpleWebServicePort();
    ((BindingProvider)proxy).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);
proxy.connect();
String[] userArray = proxy.getUserInfo();

サーバー wsdl フラグメント:

<message name="getUserInfo"/>
<message name="getUserInfoResponse">
    <part xmlns:ns2="http://jaxb.dev.java.net/array" name="return" type="ns2:stringArray"/>
</message>
4

1 に答える 1

2

配列の代わりに使用できListます。これは jax-ws のデフォルトです。

XmlAdapterただし、jax-ws が理解できる型とカスタムの新しい型との間で適応する、その配列型の使用を本当に主張する場合は、カスタムを使用できます。

注釈を付ける必要があります:

@XmlElement(name = "return")
@XmlJavaTypeAdapter(StringArrayXmlAdapter.class)
protected String[] _return;

StringArrayXmlAdapter :

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class StringArrayXmlTypeAdapter extends
        XmlAdapter<List<String>, String[]> {
    @Override
    public List<String> marshal(String[] arg) throws Exception {
        return new ArrayList<String>(Arrays.asList(arg));
    }

    @Override
    public String[] unmarshal(List<String> arg) throws Exception {
        return arg.toArray(new String[] {});
    }
}

配列で試していないので、このように動作することを保証できません。

于 2012-12-29T16:22:44.147 に答える