Сервер Java Jersey не получает параметры POST


Я использую Java Jersey на стороне сервера, и я использую @BeanParam для сбора параметров POST через JSON, но класс @BeanParam просто не получает их.

API:

@POST
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public Response sync(@BeanParam SyncRequestParams request) {
         .........
}

Класс @BeanParam:

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class SyncRequestParams {
   @JsonProperty("id")
   private int id;
}

Поэтому, если клиент публикует JSON, например:

{
  "id": 12345
}

SyncRequestParams по-прежнему будет иметь идентификатор 0, а не 12345

Что я не сделал прямо здесь?

Спасибо IS

2 2

2 ответа:

@BeanParam Нельзя использовать для сопоставления полезной нагрузки JSON с Бобом.

Использование @BeanParam требует, чтобы бобовые поля были аннотированы с помощью JAX-rs param аннотаций (@FormParam, @QueryParam, и т.д.). Затем среда выполнения создает объект и заполняет поля со значениями параметров. Поскольку ваш id не имеет аннотации параметра (а запрос не содержит такого параметра), он все равно равен 0.

Вы хотите, чтобы полезная нагрузка JSON запроса POST была проанализирована на экземпляр SyncRequestParams и поэтому вы должны просто написать

@POST
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public Response sync(SyncRequestParams request) {

Вам нужно аннотировать поля класса, который вы хотите создать с помощью @FormParam аннотации:

public class SyncRequestParams {
   @FormParam("id")
   private int id;
}

Смотрите более подробное объяснение здесь