java - 将 Java Class<?> 作为剩余模板的主体传递

标签 java spring rest parameter-passing

我正在实现一个公开 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/

相关文章:

java - ImageViews 到圆形 LinearLayout

spring - 处理grails中一对多关系的动态表单参数

java - 具有 DayOfWeek 列表的 JPA 实体

json - jackson 自动将 Joda DateTime 格式化为 ISO 8601 格式

java - spring-data-cassandra 存储库的多键空间支持?

java - Maven Eclipse 和依赖项

java - 矩形类型的 width() 方法未定义

web-services - 从 delphi 客户端将 JSON 数据发布到 RESTful datasnap 服务器

Java RESTful Jersey 示例?

java - 没有从 api 调用中获取可读数据