2017-01-20 12 views
1

Я изучаю, как реализовать Rest API через учебный проект.DELETE и GET имеют неправильное поведение в Jax-RS Restful App

Я столкнулся с довольно странным поведением от рутины я выполняю, чтобы проверить стандартные методы CRUD ...

Вот общее описание архитектуры коды:

  • Я использую заглушки эмулировать поведение базы данных, используя статический класс, который содержит HashMap<Long, Message> с Message являясь субъектом Я манипулируя,
    • этой ссылку HashMap заглушки, в свою очередь, данный класс MessageService, который выполняет логику реализации метода CRUD,
    • MessageService инстанцируется в классе MessageRessource, который является API-интерфейсом Rest, содержащий все методы реализации @GET, @POST, etc..., которые вызывают методы экземпляра MessageService.
  • Я должен отметить, что я добавил 2 жестко закодированные записи сообщений в MessageService конструктору, который я поставил в базе заглушки HashMap

Теперь, вот процедура, которая оставляет меня путать:

  1. Run приложение,
  2. сделать GET на /messages: Shows 2 записей,
  3. сделать POST с пользовательскими данными: Данные добавляются,
  4. сделать GET на /messages: Показывает 3 записи,
  5. сделать DELETE на /messages/3: удаление 3-й вход,
  6. сделать GET на /messages: Shows 2 записей ,
  7. сделать DELETE на /messages/2: при отладке приложения, экземпляр messageService в MessageRessource имеет HashMap размером 1 после того, как метод DELETE обрабатывается,
  8. сделать GET на /messages: Shows 2 записей вместо 1.

Мои собственные мысли по проблеме:

  • Если конструктор, который содержит жестко закодированные данные были причиной проблема, метод GET на этапе 4 не должен показывать только 3 записи, но только 2.
  • Возможно, это связано с тем, что данные не возвращаются DELETE, а POST возвращает возвращаемые данные?

Для кода, пожалуйста, см общественного проекта GitHub в messenger App by AetosAkrivis

NB: Я знаю, что это не проблема, потому что мне нужно только удалить жёстко прописанные Message записей в конструкторе, чтобы быть в состоянии нормально работать. Но мне действительно интересно узнать о причине неисправности этой процедуры.

ответ

1

Вы предположили, что контейнер JAX-RS создаст только один экземпляр службы MessageRessource, но он может решить очистить экземпляры или создать несколько. Каждый раз, когда выполняется инициализация, ваш статический messages будет обновлен с помощью двух дополнительных записей. Результаты неопределенны

@Path("/messages") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public class MessageRessource { 

    private MessageService messageService; 

    public MessageRessource() { 
     messageService = new MessageService(); 
    } 

public MessageService() { 
    messages.put(1L, new Message(1L,"Hi","Imad")); 
    messages.put(2L, new Message(2L,"Hello","Badr")); 
} 

PS: Начать свой код вместо ссылки он

+0

Так непредсказуемость переводится исправить поведение POST, но неисправного УДАЛИТЬ поведение (даже если это именно подобный результат каждый время, которое я тестирую)? – Aetos

+0

Кроме того, не могли бы вы посоветовать мне, насколько хорошо я могу выбрать свой код, чтобы разместить наиболее важные части, не обременяя сообщение. – Aetos

+1

Я имею в виду, что результаты являются неопределенными априори. Вы не знаете, как и когда контейнер будет управлять экземплярами. Вероятно, с теми же результатами результаты предсказуемы. Но, изменив версию JAX-RS, сервер приложений или даже JVM могут изменять поведение. Лучше не использовать эти методы. – pedrofb