Проблема с методом POST в веб-службе RESTful Java - PullRequest
2 голосов
/ 05 ноября 2010

Я пытаюсь создать веб-сервис RESTful, который реализует все четыре операции CRUD. Я застрял в «Создать», потому что я не могу получить опубликованные данные. Вот метод, который я написал. В качестве информации я использую RI Джерси из JAX-RS + JAXB XML для сериализации объектов.

Вот оно:

@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 ]

2 голосов
/ 05 ноября 2010

Я думаю, что ваша проблема в строке, в которой вы используете метод toString() для получения строки InputStream:

String xml = is.toString();

. Вы должны прочитать данные в потоке ввода и добавитьв новую строку.toString() является строковым представлением потока, но не его содержимым.Вы должны использовать read методы InputStream и добавлять байты к новому String, используя StringBuilder или StringWriter.

0 голосов
/ 06 ноября 2010

После потного поиска ответа я сумел это исправить!Это была просто отсутствующая зависимость от resteasy-jaxb-provider.jar.Без этого .jar сервлет не смог бы выполнить автоматическое преобразование из POJO в XML и наоборот

0 голосов
/ 05 ноября 2010

Я не понимаю, почему у вас нет 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.Эта работа уже сделана для вас

...