RESTful Java Web Service中POST方法的问题

时间:2010-11-04 22:11:41

标签: java rest jaxb jersey

我正在尝试创建一个实现所有四个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; }

}

有人能给我一些关于此事的消息吗?我已经筋疲力尽地想让这件事变得有效,但没有任何效果!

提前致谢。

3 个答案:

答案 0 :(得分:2)

我认为您的问题是使用toString()方法获取InputStream字符串的行:

String xml = is.toString();

您应该读取输入流中的数据并将其附加到新字符串。 toString()是流的字符串表示形式,但不是它的内容。您必须使用read的{​​{1}}方法,并使用InputStreamString将字节附加到新的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,反之亦然