美文网首页
13、spring mvc用@ResponseBody实现jso

13、spring mvc用@ResponseBody实现jso

作者: ltjxwxz | 来源:发表于2018-02-01 18:19 被阅读0次

    今天踩的坑,记录一下。本来前端使用ajax只传了一个参数给后台,没有拼json串,后台从request中取的值。后来想要多传一个参数,那不如直接传个对象,手动转json串很low,既然spring mvc可以帮我们做,那就用它的。
    只传一个参数前后端代码如下:

    function verifyRepeateName() {
        var nameVal = $('#name').val();
        var requestUrl = '[[@{/}]]' + 'testSuite/verifyRepeateName';
        $.ajax({type:'post', url:requestUrl, async:true, data:{name:nameVal}, success:function(result){
            console.log('result:' + result);
            if(result != '') {
                $('#errorMsg').text(result);
            }
        }});
    }
    
    @RequestMapping(value = "/verifyRepeateName", method = RequestMethod.POST)
    @ResponseBody
    public String verifyRepeateName(HttpServletRequest request) {
        String name = request.getParameter("name");
        if(!StringUtils.isEmpty(name)) {
            boolean repeatedFlag = testSuiteService.verifyRepeateName(name);
            if(repeatedFlag) {
                return ResponseConstant.REPEATEDNAMEVALUE;
            } else {
                return "";
            }
        } else {
            return "";
        }
    }
    

    传json串的方法如下:
    1、spring mvc 用jaskson做json和对象互相转换,故引入

    <!--spring mvc jackson-->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.7</version>
    </dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.7</version>
    </dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.7</version>
    </dependency>
    

    2、发请求时指定数据类型为json

    dataType:"json",
    contentType:"application/json",
    

    不加这两个报415

    3、传的json是手动拼的,格式不对,报415,可是格式改了之后报400,这样根本不知道是哪里错误了,找到了一个在后台打印错误的方法。参考http://www.jb51.net/article/120350.htm

    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public String messageNotReadable(HttpMessageNotReadableException exception,
     HttpServletResponse response){
        logger.error("请求参数不匹配。", exception);
        return exception.getMessage();
    }
    

    后台有打印错误了:
    [2018-02-01 15:46:54,708] [http-nio-7280-exec-10] [ERROR] com.picc.autoplateform.controller.TestSuiteController 请求参数不匹配。
    org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not construct instance of com.picc.autoplateform.model.TestSuite: no String-argument constructor/factory method to deserialize from String value ('{"testsuiteid":"7f429842-2c99-4f13-8208-852e8881a23c", "memo":"test", "runenv":"", "runtime":"", "projectid":"", "browsertype":"","userid":"", "createtime":"", "validflag":"", "name":"", "runtype":""}');
    大致意思就是无法解析json串咯,不知道为什么,此时json格式是正确的。
    于是手动建一个对象,再转成json串,竟然可以了。

    4、前后台代码如下

    function verifyRepeateName() {
        var obj = {};
        obj.testsuiteid = '[[${TESTSUITEEDIT.testsuiteid}]]';
        obj.name = $('#name').val();
        console.log('obj:' + obj);
        console.log('JSON.stringify(obj):' + JSON.stringify(obj));
        var requestUrl = '[[@{/}]]' + 'testSuite/verifyRepeateName';
        var resultMsg = '';
        $.ajax({type:'post',
            url:requestUrl,
            async:false,
            dataType:"json",
            contentType:"application/json",
            data:JSON.stringify(obj),
            success:function(result){
                console.log('success result:' + result);
                $('#errorMsg').text(result.responseMsg);
            }, error: function(result) {
                console.log('error result:' + result);
            }
        });
    }
    
    @RequestMapping(value = "/verifyRepeateName", method = RequestMethod.POST)
    @ResponseBody
    public String verifyRepeateName(@RequestBody TestSuite testSuite) {
        String name = testSuite.getName();
        String testSuiteId = testSuite.getTestsuiteid();
        if(!StringUtils.isEmpty(name)) {
            boolean repeatedFlag = testSuiteService.verifyRepeateName(name, testSuiteId);
            if(repeatedFlag) {
                return "{\"responseMsg\":\"" + ResponseConstant.REPEATEDNAMEVALUE + "\"}";
            } else {
                return "{\"responseMsg\":\"" + ResponseConstant.NOREPEATE + "\"}";
            }
        } else {
            return "{\"responseMsg\":\"" + ResponseConstant.NOREPEATE + "\"}";
        }
    }
    

    5、注意:指定了dataType:"json",contentType:"application/json",这两项,返回数据的格式必须是json了,之前返回的是一个提示信息,报错。

    相关文章

      网友评论

          本文标题:13、spring mvc用@ResponseBody实现jso

          本文链接:https://www.haomeiwen.com/subject/sdfjzxtx.html