Java:使用 javax.json.JsonObject 和 RESTEasy 嵌入式服务器时错误的 JSON 模式
Java: Wrong JSON schema when using javax.json.JsonObject and the RESTEasy embedded server
我正在使用 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();
}
来自TJWSEmbeddedJaxrsServer的JSON:
{
"id": {
"integral": true,
"valueType": "NUMBER"
},
"label": {
"chars": "TestGroup1",
"string": "TestGroup1",
"valueType": "STRING"
}
}
来自部署在 WildFly 上的相同代码的 JSON:
{
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>
测试Class:
@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依赖。我收到一条错误消息,指出无法找到 class org.glassfish.json.JsonProviderImpl。但是不使用 JsonObject 的序列化仍然有效:
return Response.ok(new CodedEntry("code1", "testgroup")).build();
此外,即使使用 TJWSEmbeddedJaxrsServer,这种类型的序列化也会产生预期的 JSON。
WildFly 上是否存在 javax.json.JsonObject 接口的另一种实现?
正如我所怀疑的那样,问题是错误的依赖关系。
我不得不替换依赖项
<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>
因为它具有与 WildFly 捆绑在一起的 json-p 实现:https://docs.jboss.org/resteasy/docs/3.0.7.Final/userguide/html/json-p.html
只有在 Java EE 7 JSON-P API 中实现 javax.json.JsonObject 接口时才需要这样做。
我一开始添加错了,因为我得到了找不到 class org.glassfish.json.JsonProviderImpl 的错误。
我正在使用 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();
}
来自TJWSEmbeddedJaxrsServer的JSON:
{
"id": {
"integral": true,
"valueType": "NUMBER"
},
"label": {
"chars": "TestGroup1",
"string": "TestGroup1",
"valueType": "STRING"
}
}
来自部署在 WildFly 上的相同代码的 JSON:
{
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>
测试Class:
@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依赖。我收到一条错误消息,指出无法找到 class org.glassfish.json.JsonProviderImpl。但是不使用 JsonObject 的序列化仍然有效:
return Response.ok(new CodedEntry("code1", "testgroup")).build();
此外,即使使用 TJWSEmbeddedJaxrsServer,这种类型的序列化也会产生预期的 JSON。
WildFly 上是否存在 javax.json.JsonObject 接口的另一种实现?
正如我所怀疑的那样,问题是错误的依赖关系。
我不得不替换依赖项
<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>
因为它具有与 WildFly 捆绑在一起的 json-p 实现:https://docs.jboss.org/resteasy/docs/3.0.7.Final/userguide/html/json-p.html
只有在 Java EE 7 JSON-P API 中实现 javax.json.JsonObject 接口时才需要这样做。
我一开始添加错了,因为我得到了找不到 class org.glassfish.json.JsonProviderImpl 的错误。