Могу ли я передать сущность Response как JSONObject, не создавая из нее строку? - PullRequest
0 голосов
/ 04 июня 2018

Я делаю пример Функции Rest и тесты для них.

Функция rest выглядит так:

@Path("ftoc/")
public class FtoC {
  @Path("{f}")
  @GET
  @Produces("application/json")
  public Response convertFtoCfromInput(@PathParam("f") double f) throws JSONException {

    JSONObject jsonObject = new JSONObject();
    double celsius;
    celsius =  convert(f); 
    jsonObject.put("F Value", f); 
    jsonObject.put("C Value", celsius);

    TemperatureCF t = new TemperatureCF(celsius, f);

    //return Response.status(200).entity(jsonObject.toString()).build(); 
    return Response.status(200).entity(jsonObject).build();
    //return Response.status(200).entity(t).build();

  }

Я пытаюсь передать ответ тремя способами - как POJO,в виде строки и в виде JSONObject.

Функция теста, которая считывает результат:

@Test
public void massConvertFtoC() {
  Response response = target("/ftoc/0").request().get();
  assertEquals(response.getStatus(), 200); // here it fails, 400 instead of 200
....
}


@Override
protected Application configure() {
  return new ResourceConfig(FtoC.class);
}

@BeforeClass
public void before() throws Exception {
    super.setUp();
}

Варианты String и POJO могут быть запущены тестом и возвращать упорядоченный статус200. Если я возвращаю JSONObject, когда я проверяю строку return Response.status(200).entity(jsonObject).build(), это также создает правильный ответ.Но когда процесс достигает отмеченной строки, он терпит неудачу: ответ имеет статус 400 вместо этого.Если я readEntity(String.class), я получаю:

Не найден сериализатор для класса org.json.JSONObject и не обнаружены свойства для создания BeanSerializer (во избежание исключения отключите SerializationFeature.FAIL_ON_EMPTY_BEANS)

Мои maven зависимости:

<dependencies>
    <dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20170516</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.20</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.14.3</version>
    </dependency>

    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>${jaxrs.version}</version>
    </dependency>

    <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.0.1</version>
          <scope>provided</scope>
    </dependency> 

    <!-- Jersey 2.27 -->
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-common</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>${jersey2.version}</version>
    </dependency>       
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.test-framework.providers</groupId>
        <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
</dependencies>

Я ищу простое решение.Добавить .register (JacksonFeature.class) - это нормально (на самом деле не помогает).Но я не хочу создавать несколько больших дополнительных классов.I


Правка о предполагаемом дублировании:
Вопрос абсолютно отличается от JSONObject, поскольку переменная-член в POJO не распознана -Джерси , потому что:

  • ТАМ проблема не работает JSONObject в POJO, и ЗДЕСЬ проблема в том, что JSONObject не будет работать, а POJO работает.И JSONObject не находится в POJO.
  • Сообщение о проблеме не упоминается ТАМ.
  • ТАМ вопрос не о тестировании и / или JerseyTest

Ответ Павла на упомянутый вопрос более связанна этот вопрос.По крайней мере, речь идет о JerseyTest.Но идеи из ответа не могут быть использованы здесь.Предложенная зависимость делает сбой вызова REST на 500 вместо 400. register(JacksonFeature.class) вообще не меняет поведение.И предложенный маппер должен получить класс отображаемого типа.И это именно то, что я хочу избежать.И в любом случае, даже если бы это было применимо, близость ответа не означает дублирование вопроса.

...