Pass Java Class как тело шаблона отдыха - PullRequest
1 голос
/ 20 января 2020

Я внедряю сервис, который предоставляет конечную точку POST. Эта служба запрашивает базу данных Sql (MongoDB, но я думаю, что она не имеет значения) и должна возвращать список java объектов универсального c класса. Теперь моя цель состоит в том, чтобы передать этому сервису только 2 параметра: строку запроса и объект Class для создания обобщенного c синтаксического анализатора. Мой вопрос: как мне передать объект Class внутри полезной нагрузки Json HTTP-вызова Post? Я не уверен, что это возможно, он думает, что единственный способ сделать это - через байт [] или что-то в этом роде. Но как я мог тогда перестроить в 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 как тип возвращаемого значения.

На стороне сервера ..

    @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 я хотел бы создать класс generi c? расширяет сериализуемость, используя поля, которые содержатся в объекте Class. Дело в том, как передать объект Class в теле Json.

Редактировать 2 Есть ли способ достичь этого без отображения объектов, которые я возвращаю на стороне сервера?

1 Ответ

1 голос
/ 20 января 2020

Простым решением будет использование «полностью определенного имени класса» класса, которое является String. Это может быть легко отправлено в JSON.

Например:

Быстрый класс утилит:

public class Payload {
    private String query;
    private String className;

    // getters and setters
}

В вашем контроллере вы получаете значение класса, используя Class.forName():

@RequestMapping(...)
public void foo(@RequestBody Payload payload) throws ClassNotFoundException {
    Class c = Class.forName(payload.getClassName());
    doSomething(c, payload.getQuery());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...