Передача массива JS в виде списка <> в контроллер Spring MVC - PullRequest
0 голосов
/ 20 февраля 2020

Я разрабатываю интерфейс моего веб-приложения, используя ReactJs. Здесь я делаю POST API, передавая массив объектов.

Объекты создаются в обработчике событий следующим образом:

eventHandler(id1, id2, e) {
    let payload = this.state.payload;
    let changedItem= {
        changeTo: e,
        id1: id1,
        id2: id2
    };

    let res = [];
    payload.forEach(item=> {
        if (item.id1 !== id1
            || item.id2 !== id2) {
            res.push(control);
        }
    });
    res.push(changedItem);

    this.setState({
        payload: res
    });
}

Я проверил это, напечатав массив после этого. Затем я выполняю вызов POST, передавая массив:

onClick() {

    let changedControls = (this.state.payload);

    updateControls(changedControls).then(() => {
        this.setState({
            payload: []
        });
    }).catch((error) => {
         console.log(error);
    })
}

Вызов API определяется в отдельном файле как:

export const updateControls = (changedControls) => {
let uri = '/api/update-controls';
return new Promise((resolve, reject) => {
    axios.post(uri, changedControls).then(response => {
        if (response != null) {
            resolve(response.data)
        }
    }).catch(err => {
        console.log(err.response.data);
    })
})

};

В идеале следующим шагом должен был бы быть вызванный мой Java контроллер, определяемый как:

@RequestMapping(value = "/update-controls", method = RequestMethod.POST)
public void updateControls(@RequestParam(value = "updatedControls") List<ControlsUpdate> updatedControls) throws Exception {
    initServiceClientRest();
    String user = getUserId();

    ResponseEntity responseEntity = serviceClientRest.update(updatedControls, user);

    if (responseEntity != null) {
        if (responseEntity.getStatusCode() != HttpStatus.OK) {
            throwErrorMessages(responseEntity);
        }
    }
}

Я считаю, что именно в этом и заключается ошибка. Я получаю сообщение об ошибке 400: «Обязательный параметр списка« updatedControls »отсутствует».

Есть предложения?

РЕДАКТИРОВАТЬ: Извините за опечатку в вызове API POST! Но это не проблема, просто опечатка, которую я сделал при копировании в коде

EDIT2:

Ошибка:

feign.FeignException$InternalServerError: status 500 reading serviceClientRest#updateAccessControls(List,String)
at feign.FeignException.errorStatus(FeignException.java:114) ~[feign-core-10.2.3.jar:na]
at feign.FeignException.errorStatus(FeignException.java:86) ~[feign-core-10.2.3.jar:na]
at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:93) ~[feign-core-10.2.3.jar:na]
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:149) ~[feign-core-10.2.3.jar:na]
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:78) ~[feign-core-10.2.3.jar:na]
at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103) ~[feign-core-10.2.3.jar:na]
at com.sun.proxy.$Proxy155.updateAccessControls(Unknown Source) ~[na:na]
at ScoringConfigController.updateControls(ScoringConfigController.java:135) ~[main/:na]

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Вы отправляете свой массив как тело запроса, верно? Вы должны использовать @RequestBody вместо @RequestParam

public void updateControls(@RequestBody List<ControlsUpdate> updatedControls) throws Exception {...}

@RequestParam используется для строк запроса URL

0 голосов
/ 20 февраля 2020
axios.post(uri, changedControls).then(response => {

вместо

axios.post(uri, updatedControls).then(response => {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...