2

JAX-rsを使用してサーバーからクライアントにArrayListを送信する際に問題が発生しました。私は4つのクラスを持っています:

デモ-RESTサーバーの起動がありますFileDetails-データを格納する3つのフィールドがありますConfigFiles-ファイルのメソッドがほとんどなく、FileDetailsオブジェクトのリストがありますRestServer-メソッドGETがあります

私は次のコードを持っています:

@XmlRootElement(name="FileDetails")
@Path("/easy")
public class RestSerwer {

    @GET
    @Path("/temporary")
    @Produces("text/temporary")
    public String methodGet() { 
        ConfigFiles cf = ConfigFiles.getInstance();
           List<FileDetails> files = cf.getList();
                   try {
                       JAXBContext ctx = JAXBContext.newInstance(ArrayList.class, FileDetails.class);
                       Marshaller m = ctx.createMarshaller();
                       StringWriter sw = new StringWriter();
                       m.marshal(files, sw);
                       return sw.toString();
                   } catch (JAXBException e) {
                       e.printStackTrace();
                   }
                   return null;
    }
}

クライアント側では、GetRestがあります。

public class GetRest{

    HttpClient client = null;
    GetMethod method = null;
    private String url = null;

    public GetRest(String url) {
        this.url = url;
    }

    public String getBody(String urlDetail){
           client = new HttpClient();
           method = new GetMethod(url + urlDetail);
           method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
           new DefaultHttpMethodRetryHandler(3, false));
           try {
                client.executeMethod(method);
            } catch (HttpException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


            byte[] responseBody = null;
            try {
                responseBody = method.getResponseBody();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{                   
                method.releaseConnection();
            }
            String str = new String(responseBody);
            return str;
    }   

    public String getFiles(){   
        return getBody("/easy/temporary");
    }   
}

私が試してみると:

GetRest getRestClass = new GetRest("http://localhost:8185");
                        //List<FileDetails> cf = new ArrayList<FileDetails>();
                        String xxxx = getRestClass.getFiles(); // TODO

それは投げます:

Caused by: com.sun.istack.internal.SAXException2: unable to marshal type "java.util.ArrayList" as an element because it is missing an @XmlRootElement annotation

サーバー側。

誰かが私を助けることができますか?

ありがとう

4

1 に答える 1

1

基本的に2つの可能性があります。リストの一番上にラッパーである独自のクラスを作成するか、独自のプロバイダーを作成してジャージに挿入し、配列リストをマーシャル/アンマーシャルする方法を認識できるようにします。最初のソリューションの簡単なコードは次のとおりです。

@XmlRootElement
public class MyListWrapper {

    @XmlElement(name = "List")
    private List<String> list;

    public MyListWrapper() {/*JAXB requires it */

    }

    public MyListWrapper(List<String> stringList) {
        list = stringList;
    }

    public List<String> getStringList() {
        return list;
    }

}
于 2012-05-09T14:51:23.930 に答える