Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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 “错误”;“400错误请求”;客户端发送的请求在语法上不正确_Java_Jquery_Ajax_Spring_Spring Mvc - Fatal编程技术网

Java “错误”;“400错误请求”;客户端发送的请求在语法上不正确

Java “错误”;“400错误请求”;客户端发送的请求在语法上不正确,java,jquery,ajax,spring,spring-mvc,Java,Jquery,Ajax,Spring,Spring Mvc,我不熟悉jQuery,并尝试使用Ajax调用Web服务。它似乎相当简单的代码,但不知何故无法理解其失败的原因。我尝试了所有可能的方法(我能想到的),但不知何故没有成功 Jsp代码: function tmpData() { var dataObject = JSON.stringify({ 'empfname': "First Name", 'emplname': "Last Name" }); alert("dataObject=" + dataObject); $.a

我不熟悉jQuery,并尝试使用Ajax调用Web服务。它似乎相当简单的代码,但不知何故无法理解其失败的原因。我尝试了所有可能的方法(我能想到的),但不知何故没有成功

Jsp代码:

function tmpData() {
  var dataObject = JSON.stringify({
    'empfname': "First Name",
    'emplname': "Last Name"
});

alert("dataObject=" + dataObject);

$.ajax({
    url:"http://localhost:8080/OnlineStore/kmsg/grocery/tmpinfo",
    type:"POST",
    contentType: 'application/json',
    data: dataObject,
    done: setData,
    fail: displayError()
 });
}; // end of function
控制器:

@RestController
@RequestMapping("/kmsg/grocery")
public class TmpSvcImpl implements TmpSvcInt {
@Override
@RequestMapping(value = "/tmpinfo", method = RequestMethod.POST, headers = "Accept=application/json")
public @ResponseBody Map<String, Object> setData(@RequestBody final Emp employee1) throws Exception {

    System.out.println("employee1=" + employee1);
    String fname = employee1.getEmpfname();
    String lname = employee1.getEmplname();
    System.out.println("fn=" + fname ) ;
    System.out.println("ln=" + lname ) ;

    return null;
  }
}

在您描述的块中:

@RestController
@RequestMapping("/kmsg/grocery")
public class TmpSvcImpl implements TmpSvcInt {
    @Override
    @RequestMapping(
             value = "/tmpinfo", 
             method = RequestMethod.POST, 
             headers = "Accept=application/json")
    public @ResponseBody Map<String, Object> setData(@RequestBody final Emp employee1) throws Exception {
        System.out.println("employee1=" + employee1);
        String fname = employee1.getEmpfname();
        String lname = employee1.getEmplname();
        System.out.println("fn=" + fname ) ;
        System.out.println("ln=" + lname ) ;
        return null;
    }
}
@RestController
@请求映射(“/kmsg/screery”)
公共类TmpSvcImpl实现TmpSvcInt{
@凌驾
@请求映射(
value=“/tmpinfo”,
method=RequestMethod.POST,
headers=“Accept=application/json”)
public@ResponseBody映射setData(@RequestBody final Emp Emp employee1)引发异常{
System.out.println(“employee1=“+employee1”);
字符串fname=employee1.getEmpfname();
字符串lname=employee1.GetEmplyName();
System.out.println(“fn=“+fname”);
System.out.println(“ln=“+lname”);
返回null;
}
}
为此用例指定“Accept”标头实际上并不正确。如果希望此方法仅在内容类型为“application/json”时响应,则必须添加“application/json”的consumes属性。正如一位评论指出的那样,这并不是绝对必要的。添加“application/json”的products属性将确保Spring将尝试将返回的内容封送为json结构

@RestController
@RequestMapping("/kmsg/grocery")
public class TmpSvcImpl implements TmpSvcInt {
    @Override
    @RequestMapping(
             value = "/tmpinfo", 
             method = RequestMethod.POST, 
             consumes = "application/json",
             produces = "application/json")
    public @ResponseBody Map<String, Object> setData(@RequestBody final Emp employee1) throws Exception {
        System.out.println("employee1=" + employee1);
        String fname = employee1.getEmpfname();
        String lname = employee1.getEmplname();
        System.out.println("fn=" + fname ) ;
        System.out.println("ln=" + lname ) ;
        return null;
    }
}
@RestController
@请求映射(“/kmsg/screery”)
公共类TmpSvcImpl实现TmpSvcInt{
@凌驾
@请求映射(
value=“/tmpinfo”,
method=RequestMethod.POST,
consumes=“application/json”,
products=“application/json”)
public@ResponseBody映射setData(@RequestBody final Emp Emp employee1)引发异常{
System.out.println(“employee1=“+employee1”);
字符串fname=employee1.getEmpfname();
字符串lname=employee1.GetEmplyName();
System.out.println(“fn=“+fname”);
System.out.println(“ln=“+lname”);
返回null;
}
}

在您描述的块中:

@RestController
@RequestMapping("/kmsg/grocery")
public class TmpSvcImpl implements TmpSvcInt {
    @Override
    @RequestMapping(
             value = "/tmpinfo", 
             method = RequestMethod.POST, 
             headers = "Accept=application/json")
    public @ResponseBody Map<String, Object> setData(@RequestBody final Emp employee1) throws Exception {
        System.out.println("employee1=" + employee1);
        String fname = employee1.getEmpfname();
        String lname = employee1.getEmplname();
        System.out.println("fn=" + fname ) ;
        System.out.println("ln=" + lname ) ;
        return null;
    }
}
@RestController
@请求映射(“/kmsg/screery”)
公共类TmpSvcImpl实现TmpSvcInt{
@凌驾
@请求映射(
value=“/tmpinfo”,
method=RequestMethod.POST,
headers=“Accept=application/json”)
public@ResponseBody映射setData(@RequestBody final Emp Emp employee1)引发异常{
System.out.println(“employee1=“+employee1”);
字符串fname=employee1.getEmpfname();
字符串lname=employee1.GetEmplyName();
System.out.println(“fn=“+fname”);
System.out.println(“ln=“+lname”);
返回null;
}
}
为此用例指定“Accept”标头实际上并不正确。如果希望此方法仅在内容类型为“application/json”时响应,则必须添加“application/json”的consumes属性。正如一位评论指出的那样,这并不是绝对必要的。添加“application/json”的products属性将确保Spring将尝试将返回的内容封送为json结构

@RestController
@RequestMapping("/kmsg/grocery")
public class TmpSvcImpl implements TmpSvcInt {
    @Override
    @RequestMapping(
             value = "/tmpinfo", 
             method = RequestMethod.POST, 
             consumes = "application/json",
             produces = "application/json")
    public @ResponseBody Map<String, Object> setData(@RequestBody final Emp employee1) throws Exception {
        System.out.println("employee1=" + employee1);
        String fname = employee1.getEmpfname();
        String lname = employee1.getEmplname();
        System.out.println("fn=" + fname ) ;
        System.out.println("ln=" + lname ) ;
        return null;
    }
}
@RestController
@请求映射(“/kmsg/screery”)
公共类TmpSvcImpl实现TmpSvcInt{
@凌驾
@请求映射(
value=“/tmpinfo”,
method=RequestMethod.POST,
consumes=“application/json”,
products=“application/json”)
public@ResponseBody映射setData(@RequestBody final Emp Emp employee1)引发异常{
System.out.println(“employee1=“+employee1”);
字符串fname=employee1.getEmpfname();
字符串lname=employee1.GetEmplyName();
System.out.println(“fn=“+fname”);
System.out.println(“ln=“+lname”);
返回null;
}
}

将默认构造函数添加到
Emp
类中,以便
Jackson
能够创建它的实例,如下所示:

public class Emp implements Serializable {

    private static final long serialVersionUID = 1L;
    public String empfname;
    public String emplname;

    public String getEmpfname() {
        return empfname;
    }

    public void setEmpfname(String empfname) {
        this.empfname = empfname;
    }

    public String getEmplname() {
        return emplname;
    }

    public void setEmplname(String emplname) {
        this.emplname = emplname;
    }

    public Emp(String fn, String ln) {
        this.empfname = fn;
        this.emplname = ln;
    }

    /**
     * default constructor
     */
    public Emp() {

    }

    @Override
    public String toString() {
        return "Emp {empfname=" + empfname + ", emplname=" + emplname + "}";
    }
}

将默认构造函数添加到
Emp
类中,以便
Jackson
能够创建它的实例,如下所示:

public class Emp implements Serializable {

    private static final long serialVersionUID = 1L;
    public String empfname;
    public String emplname;

    public String getEmpfname() {
        return empfname;
    }

    public void setEmpfname(String empfname) {
        this.empfname = empfname;
    }

    public String getEmplname() {
        return emplname;
    }

    public void setEmplname(String emplname) {
        this.emplname = emplname;
    }

    public Emp(String fn, String ln) {
        this.empfname = fn;
        this.emplname = ln;
    }

    /**
     * default constructor
     */
    public Emp() {

    }

    @Override
    public String toString() {
        return "Emp {empfname=" + empfname + ", emplname=" + emplname + "}";
    }
}

我可能错了,但我不认为您需要JSON.stringify发送数据对象;我相信jQuery可以处理这个问题。@dawsonc623结果是一样的。获取错误的请求错误。可能应该先询问此问题,但您的控制器是否受到攻击?@dawsonc623是的。如果我发送一个常规的字符串,控制器也会显示它。@Harry你打开调试日志了吗?我认为这里有更深层次的问题,如果在提交请求时查看是否产生了任何堆栈跟踪,这将非常有帮助;我相信jQuery可以处理这个问题。@dawsonc623结果是一样的。获取错误的请求错误。可能应该先询问此问题,但您的控制器是否受到攻击?@dawsonc623是的。如果我发送一个常规的字符串,控制器也会显示它。@Harry你打开调试日志了吗?我认为这里正在进行更深入的工作,如果在提交请求时查看是否产生了任何堆栈跟踪,这将非常有帮助。
X-Requested-With
头由jQuery设置。不是每个AJAX调用都有它。缺少的
会消耗
意味着“接受一切”,因此在这种情况下不需要。语句“指定“Accept”头不是真正正确的”是正确的,但不是因为您提到的原因。jQuery设置了
X-Requested-With
头。不是每个AJAX调用都有它。缺少的
会消耗
意味着“接受一切”,因此在这种情况下不需要。语句“指定'Accept'头不是真正正确的”是正确的,但不是因为您提到的原因。如果OP不需要默认构造函数,为什么要添加默认构造函数?我们也不知道杰克逊是否是