Некорректная передача параметров в URI

242
09 февраля 2018, 20:47

Внимание! Можете не напрягаться над решением, просто подскажите в каком направлении думать!

Имеем очень простой сервис:

    @GET
    @Path("/search")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response getSubscriber(@QueryParam("data") SubscriberSearchFormData data){   
        System.out.println(data);
        List <SubscrEntity> results = null  //list of results
        return Response.ok(results).build();
    }

Класс SubscriberSearchFormData:

public class SubscriberSearchFormData {
    private String name;
    private String street;
    private Integer contractNumber;
    public static SubscriberSearchFormData fromString(String jsonRepresentation) throws Exception { 
          System.out.println("WE ARE HERE");
          ObjectMapper mapper = new ObjectMapper(); // Jackson's JSON marshaller
          SubscriberSearchFormData obj = null;
          try {
           obj = mapper.readValue(decoded, SubscriberSearchFormData.class);
          } catch (IOException e) {
           throw new Exception("Wrong JSON parameters!");
          }
          return obj;
    }
    //all getters and setters
}

По задумке, JSON должен автоматически парситься благодаря методу fromString в объект класса SubscriberSearchFormData. И с ним дальше будем работать. Но как только я вызываю сервис:

localhost:8080/application/rest/catalog/subscriber/search?data={
"name":"bbb",
"street":"eee",
"contractNumber":5
}

Всё падает из-за ошибки:

11:24:04,050 WARN  [org.jboss.resteasy.resteasy_jaxrs.i18n] (default task-3) RESTEASY002130:
Failed to parse request.: javax.ws.rs.core.UriBuilderException: RESTEASY003330: 
Failed to create URI: http://localhost:8080/application/rest/catalog/subscriber/search?data={%20%22name%22:%22bbb%22,%20%22street%22:%22eee%22,%20%22contractNumber%22:%225%22}

И при этом, System.out.println("WE ARE HERE"); даже не вызывается. То есть оно рушится, ещё даже до вызова fromString();

Копаюсь в этом второй день и всё ничего не удаётся решить.

Answer 1

Установите себе для браузера Chrome расширение - Postman, которое поможет в работе с HTTP запросами.

Реализуйте метод таким образом:

@POST
@Path("/search")
@Consumes(MediaType.APPLICATION_JSON)
public Response getSubscriber(SubscriberSearchFormData data) {
    System.out.println(data);
    List <SubscrEntity> results = null  //list of results
    return Response.ok(results).build();
}

Классу SubscriberSearchFormData необходимо добавить конструктор по умолчанию и Getters/Setters.

Далее отправьте POST запрос на сервер:

И в методе получите ваш объект.

READ ALSO
Java: String.split по URL

Java: String.split по URL

Всем привет,

251
Конвертация двумерного массива в ArrayList

Конвертация двумерного массива в ArrayList

Есть метод, который конвертирует двумерный массив в ArrayList

328
Как остановить поток main, пока все ArrayBlockingQueue не выполнятся?

Как остановить поток main, пока все ArrayBlockingQueue не выполнятся?

Как остановить поток main, пока все ArrayBlockingQueue не выполнятся? То есть, существует main поток в котором я запускаю другие потоки для выполнения...

237