2012-05-09 15 views
2

JAX-rを使用してサーバーからクライアントにArrayListを送信する際に問題があります。 - RESTサーバーに FileDetailsが開始される - データ ConfigFilesを保存する3つのフィールドがある - それは、ファイルのためのいくつかのメソッドを持っており、FileDetailsのリスト RestServerオブジェクトがあります - 方法があるRESTの要素のマーシャリング

デモ:私は4つのクラスを持っています

私は次のコードを持って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 

サーバー側では。

誰かが私を助けることができますか?あなたがリストの一番上にラッパーであるか、または独自のproviderを書いて、それがどのようにマーシャル/アンマーシャリングArrayListに認識できるようにジャージでそれを注入するクラスを所有して作成します:あなたは基本的には2つの可能性を持っている

おかげ

答えて

1

。ここでは、最初のソリューションの簡単なコードを示します。

@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; 
    } 

} 
関連する問題