2015-07-20 4 views
0

Я отправляю запрос AJAX на мой контроллер. Однако вызов продолжается, но значение, переданное как параметр, равно нулю.ajax POST вызов контроллера дает нулевое значение весной

AJAX Jquery CALL:

var inValueURL = "/list/invalue"; 
var filter_data = { 
     supplierid: 1 
    }; 


    $filterSupplierName.on('change',function(){ 
     console.log("before ajax request"); 
      $.ajax({ 
       url: inValueUrl, 
       type: 'POST', 
       data:JSON.stringify(filter_data), 
       contentType: "application/json", 
       success: function (response) { 
        $("table").html(response); 
       }, 
       error: function() { 
        //your error code 
       } 
      }); 
     }); 

Контроллер: класс

@RequestMapping(value = "invalue", method = RequestMethod.POST,headers = "Accept=application/json") 
    @ResponseBody 
    public String redire(@RequestBody Value<Integer> supplierid){ 
     System.out.println(supplierid.getValue()); // this is null 
     return "success1"; 
    } 

Значение:

public class Value<T> { 

    public Value() {} 

    public Value(T t) { 
     this.value = t; 
    } 

    private T value; 

    public T getValue() { 
     return value; 
    } 

    public void setValue(T value) { 
     this.value = value; 
    } 
} 

Почему SupplierID останется нулевой. Заранее спасибо.

+0

Как выглядит ваш класс 'Value'? Является ли 'поставщикId' атрибутом' Value'? Если это так, вам, вероятно, не нужно «строгать» данные запроса. – woemler

+0

, измененный для включения класса значений. Идентификатор поставщика не является атрибутом класса. – Imprfectluck

+0

Есть ли причина, по которой вам нужно использовать 'Value' в качестве аргумента метода контроллера, а не просто использовать' Integer' или 'String'? – woemler

ответ

1

Причина, по которой ваш аргумент метода контроллера, Value<Integer> не является нулевым, но value.getValue() имеет значение null, является то, что Spring пытается сопоставить параметры запроса с объектами домена по имени. Вы передаете в качестве своих данных, но ваш целевой объект, value, не имеет метода setSupplierid, поэтому объект создается, но значения не заданы.

Есть пара решений вашей проблемы, в зависимости от ваших потребностей.

1. Используйте @RequestParam

Казалось бы, самое простое решение здесь было бы изменить сигнатуру метода, чтобы всегда ожидать целое число с именем supplierid:

@RequestMapping(value = "invalue", method = RequestMethod.POST,headers = "Accept=application/json") 
@ResponseBody 
public String redire(@RequestParam Integer supplierid){ 
    System.out.println(supplierid); // this is no longer null 
    return "success1"; 
} 

2. Используйте Map

Если ваш контроллер не всегда знает, какой тип данных он получит, вы можете просто бросить LL вашего входа в Map и обрабатывать входные параметры соответствующим образом:

@RequestMapping(value = "invalue", method = RequestMethod.POST,headers = "Accept=application/json") 
@ResponseBody 
public String redire(@RequestBody Map<String,String> data){ 
    if (data.containsKey("supplierid")){ 
     System.out.println(Integer.parseInt(data.get("supplierid"))); // this is no longer null 
    } 
    return "success1"; 
} 

Хотя это не является строго необходимым, так как HttpServletRequest объект присутствует в своих методах контроллер уже содержит карту всех входных параметров:

@RequestMapping(value = "invalue", method = RequestMethod.POST,headers = "Accept=application/json") 
@ResponseBody 
public String redire(HttpServletRequest request){ 
    if (request.getParameterMap.containsKey("supplierid")){ 
     System.out.println(Integer.parseInt(request.getParameterMap.get("supplierid")[0])); // this is no longer null 
    } 
    return "success1"; 
} 

3. Использование пользовательских HandlerMethodArgumentResolver

Если вы абсолютно должны использовать свои Value CLAS s, вы можете изучить расширение класса HandlerMethodArgumentResolver, который отвечает за сопоставление параметров HTTP-запроса с объектами Java. Есть несколько вопросов о переполнении стека, которые уже занимаются этим вопросом.

+0

HI, спасибо за ответ. когда я пытаюсь использовать метод 1 и метод 2. Я получаю «Не удалось загрузить ресурс: сервер ответил статусом 404 (не найден)« Ошибка. – Imprfectluck

+0

Попробуйте удалить аргумент 'headers' из аннотации' @ RequestMapping' и заменить «contentType:» application/json «' в методе jQuery AJAX с помощью 'dataType:" json "'. – woemler

+0

Упс. Нет, он работает нормально. У меня была опечатка. Метод 2 работает. Но если (request.getParameterMap(). ContainsKey ("supplierid")) {} не выполняется вообще. По-прежнему получают нулевые значения. Есть ли другой способ отправки данных? – Imprfectluck

Смежные вопросы