Могу ли я передать сущность 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)
не меняйте поведение вообще. И предложенный маппер должен получить класс отображаемого типа. И это именно то, что я хочу избежать. И в любом случае, даже если бы это было применимо, близость ответа не означает дублирование вопроса.