Java: неверная схема JSON при использовании javax.json.JsonObject и встроенного сервера RESTEasy - PullRequest
0 голосов
/ 06 ноября 2018

Я пишу тесты, используя TJWSEmbeddedJaxrsServer. Я получил сериализацию JSON, но формат отличается от того, когда я развертываю код на сервере приложений WildFly 10.

Тестовый JSON генерируется с помощью javax.json.Json. Если я просто сериализую объект, у меня не будет этой проблемы.

@GET
@Path("/testgroup")
@Produces(MediaType.APPLICATION_JSON)
public Response getTestGroup() String filter) {

    JsonObject jsonObject = Json.createObjectBuilder()
                 .add("id", 1L)
                 .add("label", "TestGroup1").build();

    return Response.ok(jsonObject).build();
}

JSON от TJWSEmbeddedJaxrsServer :

{
    "id": {
        "integral": true,
        "valueType": "NUMBER"
    },
    "label": {
        "chars": "TestGroup1",
        "string": "TestGroup1",
        "valueType": "STRING"
    }
}

JSON из того же кода, развернутого на WildFly :

{
     id: 1,
     label: "TestGroup1"
}

Зависимости Maven:

<dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc7</artifactId>
            <version>12.1.0.1.0-AP</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jackson-provider</artifactId>
            <version>${resteasy.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.json</groupId>
            <artifactId>javax.json-api</artifactId>
            <version>1.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.json</artifactId>
            <version>1.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <version>${resteasy.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-client</artifactId>
            <version>${resteasy.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>3.1.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

Тестовый класс:

@BeforeClass
public static void init() {
    scaleRecource = new ScaleRecource();
    scaleRecource.masterDataService = new MasterDataService();

    TJWSEmbeddedJaxrsServer server = new TJWSEmbeddedJaxrsServer();
    server.setPort(1234);
    server.getDeployment().getResources().add(scaleRecource);
    server.start();

    RestAssured.port=1234;
}

@Test
public void testGetGroup() {

    given()
      .when().get(rootPath + "/testgroup")
      .then().log().body().statusCode(200);

}

Неправильны ли зависимости Maven или как настроить сериализацию со встроенным сервером RESTeasy?

Редактировать : Если я удалю зависимость org.glassfish.javax.json. Я получаю сообщение об ошибке, что класс org.glassfish.json.JsonProviderImpl не может быть найден. Но сериализация без использования JsonObject все еще работает:

return Response.ok(new CodedEntry("code1", "testgroup")).build();

Кроме того, этот тип сериализации приводит к ожидаемому JSON даже при использовании TJWSEmbeddedJaxrsServer.

Есть ли другая реализация интерфейса javax.json.JsonObject, представленная в WildFly?

1 Ответ

0 голосов
/ 07 ноября 2018

Поскольку я подозревал, что проблема была неправильной зависимостью.

Мне пришлось заменить зависимость

<dependency>
     <groupId>org.glassfish</groupId>
     <artifactId>javax.json</artifactId>
     <version>1.1</version>
     <scope>test</scope>
</dependency>

с

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-json-p-provider</artifactId>
    <version>${resteasy.version}</version>
</dependency>

Поскольку это имеет реализацию json-p, которая связана с WildFly: https://docs.jboss.org/resteasy/docs/3.0.7.Final/userguide/html/json-p.html

Это необходимо только для реализации интерфейса javax.json.JsonObject из Java EE 7 JSON-P API .

Я изначально добавил не тот, потому что я получил ошибку, что класс org.glassfish.json.JsonProviderImpl не может быть найден.

...