Могу ли я передать сущность Response как JSONObject, не создавая из нее строку?

Я делаю пример функций отдыха и тестов для них.

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

@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) - это нормально (на самом деле не помогает). Но я не хочу создавать несколько больших дополнительных классов. я


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

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

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

0 ответов

Другие вопросы по тегам