当我将Javascript对象发送到Spring boot应用程序时,它会说;在请求目标中找到无效字符";

当我将Javascript对象发送到Spring boot应用程序时,它会说;在请求目标中找到无效字符";,javascript,java,jquery,spring-boot,Javascript,Java,Jquery,Spring Boot,我已经寻找了这个问题的各种可能性,但不知道为什么会发生这种情况。 它希望用javascript在localstorage中保存一个对象,然后获取该对象并将数据发送到我的spring启动应用程序。但是当我调用ajax时,它会给我一个错误,如下所示 java.lang.IllegalArgumentException: Invalid character found in the request target [/product/cart/items?{%22cartItems%22:[{%22it

我已经寻找了这个问题的各种可能性,但不知道为什么会发生这种情况。 它希望用javascript在localstorage中保存一个对象,然后获取该对象并将数据发送到我的spring启动应用程序。但是当我调用ajax时,它会给我一个错误,如下所示

java.lang.IllegalArgumentException: Invalid character found in the request target [/product/cart/items?{%22cartItems%22:[{%22itemId%22:%22asfasfa%22,%22itemCount%22:2},{%22itemId%22:%22ijhar%22,%22itemCount%22:3}]}]. The valid characters are defined in RFC 7230 and RFC 3986
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:491) ~[tomcat-embed-core-9.0.36.jar:9.0.36]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.36.jar:9.0.36]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.36.jar:9.0.36]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.36.jar:9.0.36]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) [tomcat-embed-core-9.0.36.jar:9.0.36]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.36.jar:9.0.36]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_265]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_265]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.36.jar:9.0.36]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_265]
JavaScript代码

$(文档).ready(函数(){
函数getAllItemsFromCart(){
让产品;
product=JSON.parse(localStorage.getItem(“items”);
退货产品;
}
让itemsList={};
让cartItems=[];
让items={};
项目['itemId']='asfasfa';
项目['itemCount']=2;
cartItems.push(项目);
项目={};
项目['itemId']='ijhar';
项目['itemCount']=3;
cartItems.push(项目);
itemsList['cartItems']=cartItems;
setItem('items',JSON.stringify(itemsList));
让itemsList1=getAllItemsFromCart();
$.ajax({
url:“[@{/product/cart/items}]]”,
标题:{
“接受”:“应用程序/json”,
“内容类型”:“应用程序/json”
},
方法:“获取”,
数据:JSON.stringify(itemsList1),
数据类型:“json”,
成功:功能(响应、状态、xhr){
log(“这是成功消息”)
},
错误:函数(响应){
console.debug(response.status+“:“+response.statusText);
},
beforeSend:function(){
//talman.showAjaxLoader();
},
完成:函数(){
//talman.closeAjaxLoader();
}
});
});
Java控制器

@GetMapping(value = "/cart/items",consumes = "application/json", produces = "application/json")
@ResponseBody
public String addProductToCart(@RequestBody CartItemsBean itemList){  
   return "sucess";
}
Bean

class ItemsBean {
    private String itemId;
    private String itemCount;

    public String getItemId() {
        return itemId;
    }

    public void setItemId(String itemId) {
        this.itemId = itemId;
    }

    public String getItemCount() {
        return itemCount;
    }

    public void setItemCount(String itemCount) {
        this.itemCount = itemCount;
    }
}

public class CartItemsBean {
    private List<ItemsBean> cartItems;

    public List<ItemsBean> getCartItems() {
        return cartItems;
    }

    public void setCartItems(List<ItemsBean> cartItems) {
        this.cartItems = cartItems;
    }
}
class ItemsBean{
私有字符串itemId;
私有字符串itemCount;
公共字符串getItemId(){
返回itemId;
}
公共void setItemId(字符串itemId){
this.itemId=itemId;
}
公共字符串getItemCount(){
返回项目计数;
}
公共void setItemCount(字符串itemCount){
this.itemCount=itemCount;
}
}
公共类CartItemsBean{
私人物品清单;
公共列表getCartItems(){
归还物品;
}
公共作废setCartItems(列出cartItems){
this.cartItems=cartItems;
}
}

出于安全原因,Spring Boot不接受QueryParams上的某些特殊字符

但我认为在您的情况下,需要使用JSON.stringfy来包装它


顺便说一下,有一个GET接收主体或充当POST或补丁有点奇怪。

您正在使用GET在请求主体中发送数据。试图改成Post@Ijhar
localStorage.setItem('items',JSON.stringify(itemsList))设置localStorage时,它是一个正确的对象。然后检索
product=JSON.parse(localStorage.getItem(“items”)
也是正确的,但是产品变量被声明为数组,从localStorage检索值是object。Hi@gkrthk,当我将get请求更改为post时,它完成了这项工作。谢谢。@Shiladitya,我已经改变了问题。谢谢你注意到我的错误。但它正在发挥作用。