Отправка массива json в конечную точку покоя приводит к исключению синтаксического анализа Джексона - PullRequest
0 голосов
/ 18 ноября 2018

Мой использованный стек

  • Пружинная загрузка 1.5.6 выпуска
  • AJAX JQuery 3.3.1

Моя цель

Я пытаюсь распечатать некоторые данные в отчете jasper, поэтому я создал контроллер отдыха, у меня появилась идея отправлять данные json из внешнего интерфейса и анализировать их благодаря Jackson api в Списокзатем pojo, используя JRDataBean для обработки моего отчета

Мой код

При нажатии кнопки печати я отправляю этот массив json с помощью ajax, который я получил из консоли chrome:сделав его глобальной переменной, затем используя копию (атрик, который я гуглил, чтобы получить переменное содержимое в виде строки)

  • вот мой json

.

   [ {
    "codeInterne": 45,
    "clientName": "TalcorpDZ",
    "clientPhone": "+213778217469",
    "codeExterne": "CLI201801",
    "email": "talcorpdz@gmail.com",
    "clientType": 0,
    "clientEtat": 1,
    "identifiant": "TalcorpDZ",
    "contacts": [
      {
        "nom": "Taleb",
        "prenom": "Mohammed Housseyn",
        "telephonePortable": "04330256699",
        "email": null
      }
    ],
    "adresses": [
      {
        "adress": "Batiments des enseignants Mohammed Khemisti",
        "ville": "Maghnia"
      }
    ]
  },
  {
    "codeInterne": 64,
    "clientName": "lkjhgf",
    "clientPhone": "+213778217469",
    "codeExterne": "dfghjk",
    "email": "talcorpdz@gmail.com",
    "clientType": 1,
    "clientEtat": 1,
    "identifiant": "lkjhgf",
    "contacts": [
      {
        "nom": "Taleb",
        "prenom": "Mohammed",
        "telephonePortable": "02354649",
        "email": "talcorpdz@gmail.com"
      }
    ],
    "adresses": [
      {
        "adress": "Batiments des enseignants Mohammed Khemist",
        "ville": "Maghnia"
      }
    ]
  }
]
  • и вот часть, где я делаю запрос на публикацию

.

$(document).on('click', '#menu0-func1-menu0-func1', function(){
        console.log(printData);
            var settings = {
                "async" : true,
                "crossDomain" : true,
                "url" : "http://"+document.location.host+"/facturation/print/client",
                "method" : "POST",
                "headers" : {
                    "cache-control" : "no-cache",
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                },
                "processData" : false,
                "contentType" : "application/json",
                "dataType" : "json",
                "data" : printData
            }

            $.ajax(settings).done(function(response) {
                console.log(response);

            });
    });

сообщение хорошо получено моим контроллером, который закодирован следующим образом:

@RestController
@RequestMapping(PrintController.API)
public class PrintController {
    public static final String API="print";


    @PostMapping("client")
    public void export(@RequestBody List<ClientJsonDto> datas,HttpServletResponse response){

        System.out.println(datas);

        // processing the print mechanisme

    }
}

наконец, вот мой ClientJsonDto.java

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "codeInterne",
    "clientName",
    "clientPhone",
    "codeExterne",
    "email",
    "clientType",
    "clientEtat",
    "identifiant",
    "contacts",
    "adresses"
})
public class ClientJsonDto {

    @JsonProperty("codeInterne")
    private Integer codeInterne;
    @JsonProperty("clientName")
    private String clientName;
    @JsonProperty("clientPhone")
    private String clientPhone;
    @JsonProperty("codeExterne")
    private String codeExterne;
    @JsonProperty("email")
    private String email;
    @JsonProperty("clientType")
    private Integer clientType;
    @JsonProperty("clientEtat")
    private Integer clientEtat;
    @JsonProperty("identifiant")
    private String identifiant;
    @JsonProperty("contacts")
    private List<Contact> contacts = null;
    @JsonProperty("adresses")
    private List<Adress> adresses = null;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

// getters, setters 
}

adress.java

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "adress",
    "ville"
})
public class Adress {

    @JsonProperty("adress")
    private String adress;
    @JsonProperty("ville")
    private String ville;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

//getters, setters
}

contact.java

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "nom",
    "prenom",
    "telephonePortable",
    "email"
})
public class Contact {

    @JsonProperty("nom")
    private String nom;
    @JsonProperty("prenom")
    private String prenom;
    @JsonProperty("telephonePortable")
    private String telephonePortable;
    @JsonProperty("email")
    private String email;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
 //getters setters
}

Исключение, с которым я сталкиваюсь:

2018-11-18 15: 12: 40.255 WARN 1768 --- [nio-8082-exec-9],«);вложенное исключение: com.fasterxml.jackson.core.JsonParseException: нераспознанный токен «объект»: ожидался («истина», «ложь» или «ноль») в [Source: java.io.PushbackInputStream@1df244f9;строка: 1, столбец: 9]

что я могу сделать, чтобы увидеть, что мой контроллер покоя получает в качестве тела запроса до того, как этот Джексон попытается маршалировать?

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

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Все ваши значения и сопоставления в формате json верны, но я не вижу производителя и потребителя с запросом после сопоставления, так как вам нужно явно определить производителя и потребителя.

Ошибка может быть связана с форматом данных, которые вы предоставляете своему контроллеру. Ваш метод контроллера ожидает строку JSON. Например, в случае jQuery JSON.stringify () дает вам строку JSON. Поэтому я бы посоветовал вам подтвердить это на стороне клиента, откуда вы отправляете данные на этот контроллер.

Код, который нужно изменить и проверить.

@RestController
@RequestMapping(PrintController.API)
public class PrintController {
    public static final String API="print";

@PostMapping("client",produces=MediaType.APPLICATION_JSON_VALUE,consumes=MediaType.APPLICATION_JSON_VALUE)
        public void export(@RequestBody List<ClientJsonDto> datas,HttpServletResponse response){

            System.out.println(datas);

            // processing the print mechanisme

        }
    }
0 голосов
/ 20 ноября 2018

Наконец-то починить

Я основал свое исправление на этом учебном пособии , и я упомянул о том, что я обрабатываю свой массив нечетким способом, поэтому я попробовал тот же принцип, добавил JSON.stringify и изменил тип данных на text

вот все изменения, которые я сделал

$(document).on('click', '#menu0-func1-menu0-func1', function(){
    console.log(printData);
    var jsonData =JSON.parse(JSON.stringify(printData));
        var settings = {
            "async" : true,
            "crossDomain" : true,
            "url" : "http://"+document.location.host+"/facturation/print/client",
            "method" : "POST",
            "headers" : {
                "cache-control" : "no-cache",
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            },
            "processData" : false,
            "contentType" : "application/json",
            "dataType" : "text",
            "data" : JSON.stringify(printData)
        }

        $.ajax(settings).done(function(response) {
            console.log(response);

        });
});

данные печати, которые я печатаю, обрабатываются, как показано ниже

var printData =[];

function displayList(){
    console.log("click");
    if(console.log($('#search-client').val())){
        console.log($('#search-client').val().toLowerCase());
    }
    var as=clientsData.filter((n,i,a) =>{return (
            n.email.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 || 
            n.contacts[0].nom.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 ||
            n.contacts[0].prenom.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 || 
            n.adresses[0].ville.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 || 
            n.contacts[0].telephonePortable.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0)});
    var html=' ';
    console.log(as.length);
    printData = [];
    for(var i=0; i<as.length ; i++){
        var ClientJsonDto = as[i];
        html+=[{client : as[i] , index : i}].map(RefCliElement).join('');   
        printData.push(ClientJsonDto);
    }

    console.log(JSON.stringify(printData));
    $('#clientList').html(html);
    console.log(html);

}

до исправления это было так, может быть, этой идеи следует избегать, потому что я использовал массив объектов jquery без знания

var printData;

function displayList(){
    console.log("click");
    if(console.log($('#search-client').val())){
        console.log($('#search-client').val().toLowerCase());
    }
    var as=clientsData.filter((n,i,a) =>{return (
            n.email.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 || 
            n.contacts[0].nom.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 ||
            n.contacts[0].prenom.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 || 
            n.adresses[0].ville.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 || 
            n.contacts[0].telephonePortable.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0)});
    var html=' ';
    console.log(as.length);
    for(var i=0; i<as.length ; i++){
        html+=[{client : as[i] , index : i}].map(RefCliElement).join('');   
    }
    printData = as;
    $('#clientList').html(html);
    console.log(html);

}

желаю, чтобы это помогло начальному уровню, как я в будущем

0 голосов
/ 18 ноября 2018

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

Попробуйте изменить

@RequestBody List<ClientJsonDto> datas

до

@RequestBody List<Map> datas

или

@RequestBody List datas

И посмотрите, сможете ли вы распечатать и отладить его.

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