我正在尝试创建一个实现所有四个CRUD操作的RESTful Web服务。我陷入了“创造”状态,因为不知何故我无法获取发布的数据。这是我写的方法。就像一个信息,我正在使用JAX-RS + JAXB XML的Jersey RI来序列化对象。
这是:
@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 :(得分:2)
我认为您的问题是使用toString()
方法获取InputStream
字符串的行:
String xml = is.toString();
您应该读取输入流中的数据并将其附加到新字符串。 toString()
是流的字符串表示形式,但不是它的内容。您必须使用read
的{{1}}方法,并使用InputStream
或String
将字节附加到新的StringBuilder
。
答案 1 :(得分: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。这项工作已经为您完成
答案 2 :(得分:0)
在努力出汗寻找答案之后,我设法解决了这个问题!这只是对resteasy-jaxb-provider.jar缺失的依赖。没有这个.jar,servlet无法从POJO自动转换为XML,反之亦然