Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向rest端点发送json数组会导致jackson解析异常_Java_Json_Spring Boot_Jackson - Fatal编程技术网

Java 向rest端点发送json数组会导致jackson解析异常

Java 向rest端点发送json数组会导致jackson解析异常,java,json,spring-boot,jackson,Java,Json,Spring Boot,Jackson,我用过的堆栈 弹簧靴1.5.6 realease ajax jquery 3.3.1 我的目标 我正试图将一些数据打印到jasper报表中,所以我创建了一个rest控制器,我想从前端发送json数据,并通过jackson api将其解析到pojo列表中,然后使用JRDataBean处理我的报表 我的代码 当按下打印按钮时,我正在使用ajax发送这个json数组,这是我从chrome控制台获得的,通过使其成为一个全局变量,然后使用一个副本(我在谷歌上搜索以获取字符串形式的变量内容) 这是我的

我用过的堆栈

  • 弹簧靴1.5.6 realease
  • ajax jquery 3.3.1
我的目标

我正试图将一些数据打印到jasper报表中,所以我创建了一个rest控制器,我想从前端发送json数据,并通过jackson api将其解析到pojo列表中,然后使用JRDataBean处理我的报表

我的代码

当按下打印按钮时,我正在使用ajax发送这个json数组,这是我从chrome控制台获得的,通过使其成为一个全局变量,然后使用一个副本(我在谷歌上搜索以获取字符串形式的变量内容)

  • 这是我的json

  • 这是我做post请求的部分

我的控制员很好地接受了该职位,其编码如下:

@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

    }
}
@RestController
@请求映射(PrintController.API)
公共类打印控制器{
公共静态最终字符串API=“打印”;
@后映射(“客户”)
公共void导出(@RequestBody列表数据,HttpServletResponse){
系统输出打印项次(数据);
//处理打印机制
}
}
最后是我的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 
}
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
“代码实习生”,
“客户名称”,
“客户端电话”,
“外部代码”,
“电子邮件”,
“客户端类型”,
“客户”,
“身份证明人”,
“联系人”,
“地址”
})
公共类clientjsondo{
@JsonProperty(“codeInterne”)
私有整数码内网;
@JsonProperty(“客户端名称”)
私有字符串clientName;
@JsonProperty(“客户端电话”)
私人字符串客户端电话;
@JsonProperty(“codeExterne”)
私有字符串代码外部;
@JsonProperty(“电子邮件”)
私人字符串电子邮件;
@JsonProperty(“clientType”)
私有整数clientType;
@JsonProperty(“客户服务”)
私有整数客户机;
@JsonProperty(“标识物”)
私有字符串标识符;
@JsonProperty(“联系人”)
私人列表联系人=null;
@JsonProperty(“地址”)
私有列表地址=null;
@杰索尼奥雷
私有映射additionalProperties=new HashMap();
//能手,二传手
}
address.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
}
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
“地址”,
“维尔”
})
公共类地址{
@JsonProperty(“地址”)
私有字符串地址;
@JsonProperty(“维尔”)
私家侦探;
@杰索尼奥雷
私有映射additionalProperties=new HashMap();
//能手,二传手
}
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
}
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
“名称”,
“prenom”,
“便携式电话”,
“电子邮件”
})
公共类联系人{
@JsonProperty(“nom”)
私有字符串名称;
@JsonProperty(“prenom”)
私有字符串prenom;
@JsonProperty(“便携式电话”)
私人电话;
@JsonProperty(“电子邮件”)
私人字符串电子邮件;
@杰索尼奥雷
私有映射additionalProperties=new HashMap();
//吸气剂二传手
}
我面临的例外是:

2018-11-18 15:12:40.255警告1768---[nio-8082-exec-9] .w.s.m.s.DefaultHandlerExceptionResolver:无法读取HTTP 信息: org.springframework.http.converter.httpMessageNodeTableException: JSON分析错误:无法识别的标记“对象”:应为('true', “false”或“null”);嵌套异常是 com.fasterxml.jackson.core.JsonParseException:无法识别的令牌 'object':应为[Source: java.io。PushbackInputStream@1df244f9;第1行第9列]

在jackson试图封送之前,我可以做些什么来查看我的rest控制器作为请求主体接收到了什么


我能做些什么来修复此异常?

我相信您希望查看接收到的内容,以便找到它未映射到DTO的原因

试着改变

@RequestBody List<ClientJsonDto> datas

查看是否可以打印和调试它。

我相信您希望查看接收到的内容,以便找到它没有映射到DTO的原因

试着改变

@RequestBody List<ClientJsonDto> datas

看看是否可以打印和调试它。

您的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

        }
    }
@RestController
@请求映射(PrintController.API)
公共类打印控制器{
公共静态最终字符串API=“打印”;
@PostMapping(“客户端”,products=MediaType.APPLICATION\u JSON\u VALUE,consumes=MediaType.APPLICATION\u JSON\u VALUE)
公共void导出(@RequestBody列表数据,HttpServletResponse){
系统输出打印项次(数据);
//处理打印机制
}
}

您的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

        }
    }
@RestController
@请求映射(PrintController.API)
公共类打印控制器{
公共静态最终字符串API=“打印”;
@PostMapping(“客户端”,products=MediaType.APPLICATION\u JSON\u VALUE,consumes=MediaType.APPLI
@RequestBody List datas
@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

        }
    }
$(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);

}
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);

}