我正在实现一个公开 POST 端点的服务。该服务查询 noSql 数据库(MongoDB,但我认为这并不重要),并且必须返回通用类的 java 对象列表。现在,我的目标是仅向该服务传递 2 个参数:一个查询字符串和一个 Class 对象,以便构建通用解析器。我的问题是:我该如何在 Post http 调用的 Json 负载中传递 Class 对象?我不确定这是否可能,它认为唯一的方法是通过 Byte[] 或类似的东西。但是我怎样才能在 RestController 中重建 Class 对象呢?
编辑
客户端代码示例:
public static List<CustomObject> getData(String token, String query) {
try {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new HttpErrorHandler());
//BUILD HEADERS
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.add("Authorization", token);
//BUILD BODY
JsonObject body_obj = new JsonObject();
body_obj.addProperty("query", query);
body_obj.addProperty("class", CustomObject.class);
HttpEntity<String> entity = new HttpEntity<>(body_obj.toString(), headers);
ParameterizedTypeReference<List<CustomObject>> responsetype = new ParameterizedTypeReference<List<CustomObject>>() {
};
ResponseEntity<List<CustomObject>> s = restTemplate.exchange(endpoint+"/getData", HttpMethod.POST, entity, responsetype);
return s.getBody();
} catch (Exception e) {
log.error("returning empty Map, see error handler logs for error info..");
return new ArrayLsit<CustomObject();
}
}
这会执行强制将 List 作为返回类型的 post。
在服务器端..
@PostMapping("/getData")
public ResponseEntity<List<? extends Serializable> getCognitiveData(String body, HttpServletRequest req) {
log.info("Start /getData");
String token = parseToken(req);
List<? extends Serializable> ret = processBody(body);
log.info("/getData - got "+ret.size()+" elements");
return ResponseEntity.status(HttpStatus.OK).body(ret);
}
在parseBody方法中,我想构建泛型类?使用 Class 对象中包含的字段扩展可序列化。重点是如何在Json体内传递Class对象。
编辑2 有没有办法在不映射我在服务器端返回的对象的情况下实现此目的?
最佳答案
一个简单的解决方案是使用类的“完全限定类名”,它是一个String
。这可以轻松地以 JSON 格式发送。
例如:
快速实用程序类:
public class Payload {
private String query;
private String className;
// getters and setters
}
在 Controller 中,您可以使用Class.forName()
获取类值:
@RequestMapping(...)
public void foo(@RequestBody Payload payload) throws ClassNotFoundException {
Class c = Class.forName(payload.getClassName());
doSomething(c, payload.getQuery());
}
关于java - 将 Java Class<?> 作为剩余模板的主体传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59819876/