Передача настраиваемого объекта от клиента к конечной точке REST с помощью Spring Web - PullRequest
0 голосов
/ 08 мая 2020

Я делаю клиент-серверное приложение, которое отправляет матрицу на сервер, где ее определитель вычисляется и затем отправляется обратно клиенту. Я создал этот класс-оболочку:

public class MatrixDTO { // with getters and setters
    private double[][] matrix;
    private double determinant;
}

И я также реализовал серверный лог c для получения определителя из объекта MatrixDTO. Я добавил этот RestController на сервер:

@RestController
public class MatrixController {
    @RequestMapping(value = "/", method = RequestMethod.POST)
    public MatrixDTO postMapping(@RequestParam MatrixDTO matrixDTO) {
        // code to compute determinant ommitted
        matrixDTO.setDeterminant(determinant);
        return matrixDTO;
    }

Затем в клиенте я добавил этот метод отправки запроса:

final String uri = "http://localhost:8080/?matrixDTO={matrixDTOparam}";
// initialized wrapper object only with matrix data
MatrixDTO input = new MatrixDTO(data);
Map<String, MatrixDTO> params = new HashMap<>();
params.put("matrixDTOparam", input);

RestTemplate restTemplate = new RestTemplate();

result = restTemplate.postForObject(uri, input, MatrixDTO.class, params);
// now I should be able to extract the determinant with result.getDeterminant()

Многие часы были потеряны, пытаясь получить этот простой код для работы. Ошибка:

Failed to convert value of type 'java.lang.String' to required type 'MatrixDTO'; 
nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'MatrixDTO': 
no matching editors or conversion strategy found]

Мой вопрос заключается в следующем: следует ли мне выбрать другой подход к моей проблеме, и если нет, есть ли простой способ заставить код работать? Я ищу простую реализацию и не нужно много настраивать. Спасибо.

1 Ответ

0 голосов
/ 08 мая 2020

Пока что моя ошибка, похоже, использует @RequestParam вместо @RequestBody в контроллере. Изменив это и используя этот код в клиенте:

final String uri = "http://localhost:8080/";
MatrixDTO input = new MatrixDTO(data);

RestTemplate restTemplate = new RestTemplate();
result = restTemplate.postForObject(uri, input, MatrixDTO.class);

, похоже, он работает достаточно хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...