gpt4 book ai didi

json - 为什么Apache CXF将String错误地转换为JSON?

转载 作者:行者123 更新时间:2023-12-02 04:04:38 25 4
gpt4 key购买 nike

我遇到了意外的Apache CXF行为:当我从服务中返回String时,它没有正确转换为JSON-Apache CXF不会在字符串周围添加双引号,而是将其原样返回。

我的服务:

@Path(ROOT_URL)
@Produces(MediaType.APPLICATION_JSON)
public class SomeRestService {

@GET
@Path(SERVICE_URL)
public Response getString() {
return Response.ok("OK").build();
}

}

Apache CXF配置的一部分:
<jaxrs:server id="RestService" address="/api">
<jaxrs:serviceBeans>
<bean class="org.example.project.ws.rest.SomeRestService" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
</jaxrs:extensionMappings>
</jaxrs:server>

您能帮我理解为什么这种方式起作用以及如何告诉CXF返回字符串为真正的JSON吗?

最佳答案

JSON是一种序列化复杂对象的方法,而Java的字符串不是(有效)序列化的。这意味着无法将字符串直接序列化为JSON对象。序列化器只是不知道将其映射为什么,因此无法使用(或者不为String启用自身)。有两个可能的修复程序。

选项1:使用其他内容类型

字符串的自然映射是消息类型为text/plain而不是application/json的消息内容。该映射内置于CXF(以及其他任何JAX-RS实现)中,并且很容易使其工作。 (我更喜欢在单个方法而不是整个类上生成和使用注释,但这是个人选择。)

@Path(ROOT_URL)
public class SomeRestService {
@GET
@Path(SERVICE_URL)
@Produces("text/plain")
public Response getString() {
return Response.ok("OK").build();
}
}

选项2:将字符串包装在带有JAXB注释的对象中

如果您确实希望数据以JSON格式存储,则需要提供其他元数据。通过添加具有JAXB批注的包装器类来实现此目的的最简单方法,然后使Jettison(CXF使用的序列化库)吐出正确的内容。在下面的示例中,我使用了一个静态内部类,因为它使(根本很无聊的)类与使用它的唯一位置(YMMV)保持接近。不过,它确实必须是带有注释的 public “结构”(即,具有无参数构造函数且具有 public 字段或适当的简单getter和setter的类)。
@Path(ROOT_URL)
public class SomeRestService {
@GET
@Path(SERVICE_URL)
@Produces("application/json")
public Response getServiceMessage() {
ServiceMessage result = new ServiceMessage();
result.message = "OK";
return Response.ok(result).build();
// Or: return Response.ok(result,"application/json").build();
// Or: return Response.ok(result).type("application/json").build();
}

@XmlRootElement // This annotation _is_ required, can be customized further
public static class ServiceMessage {
@XmlElement // This annotation isn't required, but documents intention
public String message;
}
}

我省略了为 ServiceMessage构建一整套构造函数的方法,这使得使用它的便利性略差一些。该代码(几乎)是纯裸露的。

关于json - 为什么Apache CXF将String错误地转换为JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8339868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com