Как решить проблему неверного запроса: недопустимый ввод JSON: невозможно десериализовать экземпляр `java .lang.String` из токена START_ARRAY - PullRequest
0 голосов
/ 06 августа 2020

Я попытаюсь отправить JSON на мой RESTAPI через Post-Call. Поэтому у меня есть этот метод Это мой метод публикации, который я пробовал:

public void post() throws JsonProcessingException {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
            parameters.add("tcpident","1");
            parameters.add("requestid","2");
            parameters.add("mclass","3");
            parameters.add("mno","4");
            parameters.add("errorstate","5");
            parameters.add("datalength","6");
            parameters.add("resourceid","1");
            parameters.add("ono","2");
            parameters.add("opos","3");
            parameters.add("wpno","23");
            parameters.add("opno","ddsds");
            parameters.add("bufno","d");
            parameters.add("bufpos","ds");
            parameters.add("carrierid","dsdd");
            parameters.add("palletid","dsd");
            parameters.add("palletpos","dsd");
            parameters.add("pno","dsd");
            parameters.add("oposid","ds");
            parameters.add("stepno","dsd");
            parameters.add("maxrecords","dsd");
            parameters.add("boxid","dsd");
            parameters.add("boxpos","dsd");
            parameters.add("mainopos","dsds");
            parameters.add("eltno","dsd");
            parameters.add("cno","dsd");
            parameters.add("boxpno","ds");
            parameters.add("palletpno","dsd");
            parameters.add("aux1int","ds");
            parameters.add("aux2int","ds");
            parameters.add("aux1dint","dsdsd");
            parameters.add("aux2dint","dsd");
            parameters.add("mainpno","dsod");
            //String json = new ObjectMapper().writeValueAsString(parameters);
            HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(parameters,headers);
            ResponseEntity<Call[]> response = restTemplate.postForEntity("http://localhost:8080/calls", request, Call[].class);
        }

Мой JSON должен выглядеть так:

{
  "tcpident": "00110011",
  "requestid": 47
...
}

Но теперь я получаю эту ошибку, я не понимаю почему и как это решить. Я искал другие вопросы о переполнении стека, но не понял.

Ошибка:

2020-08-06 10:32:40.100 ERROR 14384 --- [nio-8080-exec-8] org.camunda.bpm.engine.context           : ENGINE-16004 Exception while closing command context: 400 : [{"timestamp":"2020-08-06T08:32:40.054+0000","status":400,"error":"Bad Request","message":"Invalid JSON input: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token; nested excepti... (484 bytes)]

org.springframework.web.client.HttpClientErrorException$BadRequest: 400 : [{"timestamp":"2020-08-06T08:32:40.054+0000","status":400,"error":"Bad Request","message":"Invalid JSON input: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token; nested excepti... (484 bytes)]
    at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:101) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:782) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:740) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:583) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at com.example.workflow.PostRequestDelegate.post(PostRequestDelegate.java:86) ~[classes/:na]
    at com.example.workflow.PostRequestDelegate.execute(PostRequestDelegate.java:26) ~[classes/:na]

РЕДАКТИРОВАТЬ: Мой класс контроллера выглядит так:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class CallController {

    @Autowired
    private CallService callService;

    @GetMapping("/calls")
    public List<Call> getAllCalls(){
        return callService.getAllCallList();
    }

    @PostMapping(value = "/calls")
    public void addCall(@RequestBody Call call){
        callService.addCall(call);
    }
}

My ModelClass:

public class Call {
    String tcpident, requestid, mclass, mno, errorstate, datalength, resourceid, ono, opos,
            wpno, opno, bufno, bufpos, carrierid, palletid, palletpos, pno, oposid, stepno,
            maxrecords, boxid, boxpos, mainopos, beltno, cno, boxpno, palletpno,aux1int,
            aux2int,aux1dint,aux2dint,mainpno;

    public Call() {
    }

    public Call(String tcpident, String requestid, String mclass, String mno, String errorstate, String datalength,
                String resourceid, String ono, String opos, String wpno, String opno, String bufno, String bufpos,
                String carrierid, String palletid, String palletpos, String pno, String oposid, String stepno,
                String maxrecords, String boxid, String boxpos, String mainopos, String beltno, String cno,
                String boxpno, String palletpno, String aux1int, String aux2int, String aux1dint,
                String aux2dint, String mainpno) {
        this.tcpident = tcpident;
        this.requestid = requestid;
....

+ //each getter and setter

Мой класс обслуживания:

import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Service
public class CallService {
    private List<Call> callList = new ArrayList<>(Arrays.asList(new Call("33333301","61","Test",
            "Test","Test","Test","Test","Test","Test","Test",
            "Test","Test","Test","Test","Test","Test","Test",
            "Test","Test","Test","Test","Test","Test",
            "Test","Test","Test","Test","Test","Test",
            "Test","Test","Test"),new Call("33333302","61","Test",
            "Test","Test","Test","Test","Test","Test","Test",
            "Test","Test","Test","Test","Test","Test","Test",
            "Test","Test","Test","Test","Test","Test",
            "Test","Test","Test","Test","Test","Test",
            "Test","Test","Test")));

    public List<Call> getAllCallList() {
        return callList;
    }

    public void addCall(Call call) {
        callList.add(call);
    }
}

Если я делаю GetCall на: localhost: 8080 / calls, я получаю свой список:

[{"tcpident":"33333301","requestid":"61","mclass":"Test","mno":"Test","errorstate":"Test","datalength":"Test","resourceid":"Test","ono":"Test","opos":"Test","wpno":"Test","opno":"Test","bufno":"Test","bufpos":"Test","carrierid":"Test","palletid":"Test","palletpos":"Test","pno":"Test","oposid":"Test","stepno":"Test","maxrecords":"Test","boxid":"Test","boxpos":"Test","mainopos":"Test","beltno":"Test","cno":"Test","boxpno":"Test","palletpno":"Test","aux1int":"Test","aux2int":"Test","aux1dint":"Test","aux2dint":"Test","mainpno":"Test"},{"tcpident":"33333302","requestid":"61","mclass":"Test","mno":"Test","errorstate":"Test","datalength":"Test","resourceid":"Test","ono":"Test","opos":"Test","wpno":"Test","opno":"Test","bufno":"Test","bufpos":"Test","carrierid":"Test","palletid":"Test","palletpos":"Test","pno":"Test","oposid":"Test","stepno":"Test","maxrecords":"Test","boxid":"Test","boxpos":"Test","mainopos":"Test","beltno":"Test","cno":"Test","boxpno":"Test","palletpno":"Test","aux1int":"Test","aux2int":"Test","aux1dint":"Test","aux2dint":"Test","mainpno":"Test"}]

Но Я хочу сделать POST-вызов, чтобы добавить новый вызов.

...