REST风格的Java Web服务中POST方法的问题
问题描述:
我试图做一个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; }
}
有人可以给我一些有关此轻?我用尽了每一个想法,使这个作品,没有任何工作!
在此先感谢。
答
经过出汗努力寻找答案,我已经设法修复它!这只是对resteasy-jaxb-provider.jar的缺失依赖。如果没有这个.jar,Servlet无法自动从POJO转换为XML,反之亦然
答
我觉得你的问题是在你使用toString()
方法来获取InputStream
的串线:
String xml = is.toString();
你应该输入流中读取数据并将其追加到一个新的字符串。 toString()
是流的字符串表示,但不是它的内容。您必须使用InputStream
的read
方法,并使用StringBuilder
或StringWriter
将字节附加到新的String
。
答
我不明白你为什么没有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。这项工作已经完成了你
嗯,尝试并在尝试卷曲URI时收到此消息: 找不到类型的消息正文阅读器:内容类型为com.esconn.domain.Student的类:application/xml – 2010-11-04 23:42:36