如何在Java中将对象转换为查询字符串?

时间:2018-09-25 21:28:34

标签: java spring junit

我正在尝试将以下对象转换为查询字符串,以便可以与GET请求一起使用。

Class A {
  String prop1;
  String prop2;
  Date date1;
  Date date2;
  ClassB objB;
}

Class B {
 String prop3;
 String prop4;
}

我们可以将第一个对象映射到Map,然后将映射转换为MultiValueMap并使用URIComponentsBuilder.fromHttpUrl(“ httpL // example.com”)。queryParams(multiValueMap).build();

是否存在更短,更好的将对象转换为查询字符串的方法,以便与Spring Project中的GET请求一起用于Junit Test?

4 个答案:

答案 0 :(得分:1)

为什么要先转换为Map然后转换为MultiValueMap,而不是直接构建?

DateFormat dateFmt = new SimpleDateFormat("whatever date format you want");
URIComponentsBuilder.fromHttpUrl("httpL//example.com")
                    .queryParam("prop1", a.prop1)
                    .queryParam("prop2", a.prop2)
                    .queryParam("date1", dateFmt.format(a.date1))
                    .queryParam("date2", dateFmt.format(a.date2))
                    .queryParam("prop3", a.objB.prop3)
                    .queryParam("prop4", a.objB.prop4)
                    .build();

答案 1 :(得分:0)

OpenFeign具有注释@QueryMap,可根据对象属性动态生成查询参数:

public interface Api {
  @RequestLine("GET /find")
  V find(@QueryMap CustomPojo customPojo);
}

查看更多信息: https://github.com/OpenFeign/feign#dynamic-query-parameters

答案 2 :(得分:0)

您可以编写自己的使用java.lang.reflect的方法。这是一个例子

public static String getRequestString(String urlString, Class clazz, Object o){
    String queryString = "?";

    try {
        for (Field f : clazz.getDeclaredFields()) {
            f.setAccessible(true);
            queryString += queryString.concat(f.getName() + "=" + String.valueOf(f.get(o)) + "&");
        }
    }catch (Exception e){
        e.printStackTrace();
    }

    return urlString + queryString.substring(0,queryString.length()-1);
}

答案 3 :(得分:0)

这就是我要做的,

创建地图,填充然后迭代地图项,然后追加到构建器,这似乎对我有用。它不涵盖对嵌套对象的支持。递归应该很简单。

concat