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

dauxcl2d  于 2023-04-19  发布在  Spring
关注(0)|答案(4)|浏览(173)

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

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

Class B {
 String prop3;
 String prop4;
}

我们可以将第一个对象转换为Map,然后将map转换为MultiValueMap,并使用URIComponentsBuilder.fromHttpUrl(“httpL//example.com”).queryParams(multiValueMap).build();
是否有更短更好的方法将对象转换为查询字符串,以便在Spring Project for Junit Test中与GET请求一起使用?

5ktev3wc

5ktev3wc1#

为什么要先转换为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();
pjngdqdw

pjngdqdw2#

您可以编写自己的使用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);
}
soat7uwm

soat7uwm3#

OpenFeign有一个注解@QueryMap,可以根据对象属性生成查询参数:

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

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

jyztefdp

jyztefdp4#

我会这么做
创建Map,填充,然后遍历Map项,并附加到构建器,这似乎对我有用。它不支持嵌套对象。递归应该很简单。

public String getRequestString(Class clazz, Object o) {
        StringBuilder queryStringBuilder = new StringBuilder();
        final Map<String, String> queryParams = new LinkedHashMap<>();

        try {
            for (Field f : clazz.getDeclaredFields()) {
                f.setAccessible(true);
                queryParams.put(f.getName(), String.valueOf(f.get(o)));
            }
            for (Map.Entry<String, String> entry : queryParams.entrySet()) {
                queryStringBuilder.append(testStringUtils.toSnakeCase(entry.getKey()));
                queryStringBuilder.append("=");
                queryStringBuilder.append(entry.getValue());
                queryStringBuilder.append("&");
            }
            logger.info("Map: " + queryParams);
        } catch (Exception e) {
            e.printStackTrace();
        }
        final String queryString = queryStringBuilder.toString();
        logger.info("Query string : " + queryString.substring(0, queryString.length() - 1));
        return "?" + queryString.substring(0, queryString.length() - 1);

相关问题