使用 JAX-RS 将 JSON 查询参数转换为对象

2022-09-01 14:25:44

我有一个 JAX-RS 资源,它以 JSON 字符串的形式获取其参数,如下所示:

http://some.test/aresource?query={"paramA":"value1", "paramB":"value2"}

在这里使用JSON的原因是,查询对象在实际用例中可能非常复杂。

我想将JSON字符串转换为Java对象,示例中的dto:

@GET 
@Produces("text/plain")
public String getIt(@QueryParam("query") DataTransferObject dto ) {
    ...
}

JAX-RS 是否支持从作为查询参数传递到 Java 对象的 JSON 的这种转换?


答案 1

是的,您可以执行此操作,但您需要自己编写转换代码。幸运的是,这很容易,您只需要编写一个具有公共构造函数的类来执行转换。例如:String

public class JSONParam {
    private DataTransferObject dto;

    public JSONParam(String json) throws WebApplicationException {
        try {
            // convert json string DataTransferObject and set dto
        }
        catch (JSONException e) {
            throw new WebApplicationException(Response.status(Status.BAD_REQUEST)
                    .entity("Couldn't parse JSON string: " + e.getMessage())
                    .build());
        }
    }

    public DataTransferObject getDTO() {
        return dto;
    }
}

然后,您可以使用:

@GET 
@Produces("text/plain")
public String getIt(@QueryParam("query") JSONParam json) {
    DataTransferObject dto = json.getDTO();
    ...
}

答案 2

如前所述,您确实需要从字符串参数显式转换为 JSON。但是没有必要使用像 org.json 的解析器这样原始的东西;JacksonGson 可以在一两行中执行数据绑定(字符串到 JSON,JSON 到 POJO)。与杰克逊:

MyValue value = new ObjectMapper().readValue(json, MyValue.class);

(对于生产代码,只需创建一次ObjectMapper作为静态成员,重用)

Jackson 是大多数 JAX-RS 实现用于实现 POST 数据的数据绑定的,因此这非常相似。