Как удовлетворить предупреждение о возврате void в спокойной службе Java

Java-код:

      @GET
      @Path("/stop/{id}")
      public void stop(
      @PathParam("id") String id,
      @Context HttpServletRequest request,
      @Context HttpServletResponse response) throws ServletException,
      IOException
      {
        server.stop(id);
      }

Предупреждение Java выбрасывается на консоль:

ВНИМАНИЕ: Метод HTTP GET, public void com.myPackage.stop(java.lang.String,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) выдает javax.servlet.ServletException,java.io .IOException, ДОЛЖЕН возвращать непустой тип.


person stackoverflow    schedule 30.06.2011    source источник
comment
server.stop(id) что-то возвращает?   -  person Bobby    schedule 30.06.2011
comment
Нет. просто выполняет вызов метода, который выполняет внутренние вычисления.   -  person stackoverflow    schedule 30.06.2011
comment
Почему вы хотите перестать быть операцией GET?   -  person Michael Krussel    schedule 30.06.2011
comment
этот парень выше получает удар от нажатия кнопки. @Майкл Крассел. Какой подход был бы лучше? POST не кажется подходящим, но опять же, я не эксперт по успокоению   -  person stackoverflow    schedule 30.06.2011
comment
POST будет лучше, чем GET, и если это из веб-формы, то я считаю, что POST и GET - единственные варианты. Предоставленные ответы дают хорошее объяснение.   -  person Michael Krussel    schedule 30.06.2011


Ответы (4)


Попробуйте определить его как *V*oid и вернуть null.

  @GET
  @Path("/stop/{id}")
  public void stop(
  @PathParam("id") String id,
  @Context HttpServletRequest request,
  @Context HttpServletResponse response) throws ServletException,
  IOException
  {
    server.stop(id);
    return null;
  }
person AlexR    schedule 30.06.2011
comment
Похоже на хакерскую работу. Это решение «THE» или решение «A»? Я уже некоторое время бьюсь над этим вопросом. AlexR спасибо за ответ - person stackoverflow; 30.06.2011

Вы действительно не должны использовать операцию GET.

Я бы использовал операцию POST и вернул 201 Created со ссылкой на ресурс, описывающий новое состояние системы.

Например, я бы перенаправил на ресурс статуса выключения:

POST /stop/123
...
201 CREATED
Location:
  http://acme.com/shutdownstatus/123

Клиент может опросить ресурс, чтобы проверить статус

GET /shutdownstatus/123
...
<shutdown xmlns="http://schemas.serverapp.com/shutdown">
  <status>pending</status>
  <message>Looks good so far</message>
</shutdown> 

Эта новая операция GET всегда будет возвращать состояние сервера для этого идентификатора. Таким образом, вы узнаете, правильно ли он был выключен. Если выключение сервера занимает много времени, клиент может опросить этот ресурс, чтобы проверить различные состояния выключения, пока оно не будет завершено. Таким образом, вы можете быстро вернуться к исходному запросу на отключение сервера.

Если бы в вашем процессе было выброшено исключение, я бы не возвращал его клиенту, у меня был бы статус для исключения в ресурсе состояния сервера. Я всегда избегаю заставлять клиента обрабатывать исключительный случай, когда я могу представить его как ресурс. Это позволяет свободно изменять ресурс, например, при изменении или исправлении метода, вызывающего исключение, без изменения внешнего API.

person Daniel Canas    schedule 30.06.2011

Предупреждение правильное. Операция GET должна быть идемпотентной, поэтому не должна влиять на состояние сервера. Если вы ничего не возвращаете, метод не может делать ничего полезного. Вы должны изменить его на POST или другую подходящую операцию HTTP.

person artbristol    schedule 30.06.2011