Как реализовать исправления в RESTEasy?

Я хотел бы реализовать несколько операций в одном запросе Patch (json format). RESTEasy не поддерживает запросы Patch из коробки. Как обеспечить пользовательскую реализацию?

Ответ 1

Чтобы включить PATCH, вам необходимо определить аннотацию, аннотированную с помощью @HttpMethod:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {}

Полный пример описан в книге Билла Берка "RESTful Java с JAX-RS 2.0". Код исходного кода можно найти в репозитории репозитория.

Возможно, JAX-RS 2.1. будет поддерживать PATCH из коробки.

Обновление:. Если вы хотите исправлять несколько ресурсов в одном запросе, вам нужно сначала идентифицировать их. Например, если вы хотите, чтобы все клиенты с определенным оборотом в статусе VIP, у вас мог быть ресурсный метод следующим образом:

@PATCH
@Path("/customers")
public Response patchCustomers(@QueryParam("minTurnover") Double minTurnover, InputStream is) {
   // find and update customers
}

Какая информация передается в теле объекта, зависит от вас. RFC требует "набора изменений", который должен применяться к ресурсу. Это может быть просто text/plain как update: vip=true. Стандартным форматом для таких обновлений является json-patch:

PATCH /customers?minTurnover=1000 HTTP/1.1
Content-Type: application/json-patch

[
  { 
    "op" : "replace", 
    "path" : "/vip", 
    "value" : "true" 
  },
  {
    ... more operations ...
  }
]

Обратите внимание, что для всех идентифицированных ресурсов должен применяться тот же набор операций.