2010-11-04 96 views
2

我試圖做一個RESTful Web服務來實現所有四個CRUD操作。我被困在「創建」中,因爲我無法獲取發佈的數據。這是我寫的方法。就像一個信息,我使用JAX-RS + JAXB XML的Jersey RI來序列化對象。REST風格的Java Web服務中POST方法的問題

這就是:

@POST 
@Consumes("application/xml") 
public Response createStudent(InputStream is) { 
Student st = this.readStudent(is); 
st.setUserId(idCounter.incrementAndGet()); 
studentDB.put(st.getUserId(), st); 
System.out.println("Created student " + st.getUserId()); 
return Response.created(URI.create("/student/"+ st.getUserId())).build(); 

} 

而且readStudent方法如下:

protected Student readStudent(InputStream is){ 

JAXBContext ctx; 

Student st = null; 
try { 
    String xml = is.toString(); 
    System.out.println(xml); 
    ctx = JAXBContext.newInstance(Student.class); 
    st = (Student) ctx.createUnmarshaller().unmarshal(new StringReader(xml)); 
    return st; 
} catch (JAXBException e){ 
    e.printStackTrace(); 
} 
finally { return st; } 

} 

有人可以給我一些有關此輕?我用盡了每一個想法,使這個作品,沒有任何工作!

在此先感謝。

回答

0

經過出汗努力尋找答案,我已經設法修復它!這只是對resteasy-jaxb-provider.jar的缺失依賴。如果沒有這個.jar,Servlet無法自動從POJO轉換爲XML,反之亦然

2

我覺得你的問題是在你使用toString()方法來獲取InputStream的串線:

String xml = is.toString(); 

你應該輸入流中讀取數據並將其追加到一個新的字符串。 toString()是流的字符串表示,但不是它的內容。您必須使用InputStreamread方法,並使用StringBuilderStringWriter將字節附加到新的String

0

我不明白你爲什麼沒有createStudent(Student student)。 jsr311的整個想法是參數也被解析並賦予函數。

編輯 一秒鐘我以爲我是混淆的東西。但我發現一個例子這裏http://blogs.oracle.com/enterprisetechtips/entry/configuring_json_for_restful_web

@PUT 
     @Consumes("application/json") 
     public synchronized void setStatus(StatusInfoBean status) { 
      ... 
     } 

所以,你甚至都不需要解析XML或JSON。這項工作已經完成了你

+0

嗯,嘗試並在嘗試捲曲URI時收到此消息: 找不到類型的消息正文閱讀器:內容類型爲com.esconn.domain.Student的類:application/xml – 2010-11-04 23:42:36