将JSON对象发送到Spring MVC控制器

时间:2014-10-13 20:57:59

标签: ajax json spring spring-mvc datatable

我有一个JS:

function getSearchBO() {
var individual = ($('#individual').attr('checked') == 'checked') ? "true"
        : "false";
var organization = ($('#organization').attr('checked') == 'checked') ? "true"
        : "false"
var enrollmentId = $('#enrollmentId').attr('value').trim();
var medicareId = $('#medicareId').attr('value').trim();
var npi = $('#npi').attr('value').trim();
var contractId = $('#contractId').attr('value').trim();
var firstName = $('#firstName').attr('value').trim();
var lastName = $('#lastName').attr('value').trim();
var ssn = $('#ssn').attr('value').trim();
var dob = $('#dob').attr('value').trim();
var licenseNumber = $('#licenseNumber').attr('value').trim();
var licenseState = $('#licenseState').attr('value').trim();
var specialtyType = $('#specialtyType').attr('value').trim();
var licenseExpirationDate = $('#licenseExpirationDate').attr('value')
        .trim();
var businessName = $('#businessName').attr('value').trim();
var ein = $('#ein').attr('value').trim();
var organizationType = $('#organizationType').attr('value').trim();
var ciy = $('#ciy').attr('value').trim();
var state = $('#state').attr('value').trim();
var zipCode = $('#zipCode').attr('value').trim();
var startDate = $('#startDate').attr('value').trim();
var endDate = $('#endDate').attr('value').trim();

var searchBO = {
    "individual" : individual,
    "organization" : organization,
    "enrollmentId" : enrollmentId,
    "medicareId" : medicareId,
    "npi" : npi,
    "contractId" : contractId,
    "firstName" : firstName,
    "lastName" : lastName,
    "ssn" : ssn,
    "dob" : dob,
    "licenseNumber" : licenseNumber,
    "licenseState" : licenseState,
    "specialtyType" : specialtyType,
    "licenseExpirationDate" : licenseExpirationDate,
    "businessName" : businessName,
    "ein" : ein,
    "organizationType" : organizationType,
    "ciy" : ciy,
    "state" : state,
    "zipCode" : zipCode,
    "startDate" : startDate,
    "endDate" : endDate
}
return searchBO;
}

我正在调用这个js代码:

function setUpSearchBtn() {
$('#searchBtn').click(
        function() {
            var searchBO = getSearchBO();

            var data = JSON.stringify(searchBO);

            alert(data);

            var table = $('#searchResultTable').dataTable(
                    {
                        "processing" : true,
                        "destroy" : true,
                        "dom" : 'trtip',
                        "ajax" : {
                            "contentType" : "application/json",
                            "dataType" : 'json',
                            "url" : "search.jax",
                            "type" : "post",
                            "data" : data
                        },

                        "fnRowCallback" : function(nRow, aData,
                                iDisplayIndex) {
                            $('td:eq(1)', nRow).html(
                                    '<a href="profile.htm">' + aData[2]
                                            + '</a>');
                            return nRow;
                        },
                    });
        });

}

我有Spring Controller:

    @RequestMapping(value = "/search.jax", method = RequestMethod.POST)
@ResponseBody
public List<EntityProfileBO> doSearch(
@RequestBody SearchBO searchBO, Pagination pagination,
        HttpServletRequest request, HttpServletResponse response)
        throws APSException {
    System.out.println(searchBO.toString());
    List list = searchService.getSearch(searchBO, pagination);
    return list;
}

当我发布时,它给了我错误:

400 Bad Request

我非常确定我的配置和库都是正确的。因为同一个项目我发布了类似下面的数据并且工作正常:

                                data : JSON2.stringify({
                                selected : dataString
                            }),

有人可以帮助我检测我的ajax帖子在一个对象上的错误,而不仅仅是一个字符串。

1 个答案:

答案 0 :(得分:0)

在服务器中,您可以尝试使用org.codehaus.jackson.map.ObjectMapper将json反序列化为对象。例如:

客户端将json发送到服务器

<script type="text/javascript">
function sendAjax() {
    $.ajax({
            url: "${pageContext.servletContext.contextPath}/multiple/treenodebinding", 
            type: 'POST',
            headers: { 
                'Accept': 'application/json',
                'Content-Type': 'application/json' 
            },
            dataType: 'json', 
            data: "{\"product\":{\"name\":\""+$("#product_name").val()+"\",\"id\":"+$("#product_id").val()+
                "},\"user\":{\"name\":\""+$("#user_name").val()+"\",\"id\":"+$("#user_id").val()+",\"email\":\""+$("#user_email").val()+"\"}}", 
            contentType: 'application/json',
            mimeType: 'application/json',
            success: function(data) { 
                $("#result").html("");
                 $("#result").val(data.id + " " + data.name+" "+data.email);
            },
            error:function(data,status,er) {
                $("#result").val("error: "+data+" status: "+status+" er:"+er);
                alert("error: "+data+" status: "+status+" er:"+er);
            }
    });
   }
</script>
服务器中的

使用ObjectMapper反序列化

@RequestMapping(value = "/treenodebinding", method = RequestMethod.POST, produces =

MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public User treeNodeBinding(@RequestBody String json) {
    ObjectMapper mapper = new ObjectMapper();
    Product product = null;
    User user = null;
    try {
        JsonNode node = mapper.readTree(json);
        product = mapper.readValue(node.get("product"), Product.class);
        user = mapper.readValue(node.get("user"), User.class);
    } catch (JsonProcessingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return user;
};