Spring MVC obsługa żądania AJAX

0

Witam, mam problem z obsługą jednego żądania AJAX w Springu. Chodzi o to, że chcę przekazać pojedynczy string jako argument do metody, lecz kiedy próbuję to zrobić to ten string jest nullem. Gdy @RequestBody mam jako klasę to metoda nie jest wywoływana i żądanie AJAX kończy się bad requestem (400)

Tak wygląda metoda bez @RequestBody, gdzie dostaję null, jednak w konsoli javascriptowej widzę, że string, który próbuję przekazać nim nie jest

@RequestMapping(value="/meals/new", method=RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<Item> autocomplete(String autocomplete) {
    System.out.println(autocomplete);
        return null;
}

Ta sama metoda z użyciem @RequestBody, kończy się 400:

@RequestMapping(value="/meals/new", method=RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<Item> autocomplete(@RequestBody Autocomplete autocomplete) {
    System.out.println(autocomplete.getValue());
        return null;
}

Model klasy autocomplete:

@JsonInclude(JsonInclude.Include.NON_NULL)
@Generated("org.jsonschema2pojo")
@JsonPropertyOrder({
    "value"
 })
 public class Autocomplete {

@JsonProperty("value")
private String value;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

/**
 *
 * @return
 * The value
 */
@JsonProperty("value")
public String getValue() {
    return value;
}

/**
 *
 * @param value
 * The value
 */
@JsonProperty("value")
public void setValue(String value) {
    this.value = value;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
    return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
    this.additionalProperties.put(name, value);
}

Żądanie AJAX:

 $.ajax({
                url: $("#newMealForm").attr("action"),
                data: JSON.stringify({
                    "value": apn
                }),
                type: "GET",
                beforeSend: function (xhr) {
                    xhr.setRequestHeader("Accept", "application/json");
                    xhr.setRequestHeader("Content-Type", "application/json");
                    xhr.setRequestHeader
                },
                success: function (item) {
                    console.log(item.length);
                    availablePTags = item;
                }
            });
0

@RequestParam String autocomplete ?

0

Patrz tu:
https://github.com/Pharisaeus/SpringScaffoldApplication
masz tam przykład poprawnej konfiguracji serializacji do jsona i restowy kontroler.

1

RequestBody z metodą GET?

0
^junior^ napisał(a):

RequestBody z metodą GET?

Zadziała, zrobisz przecież zapytanie, np:

$.get("/costam/costam/", jakisParametr: "pupaslonia");

parametry zostaną doczepione do linku, js tutaj, jak dodasz np: callbacka na success: zwróci w success(function(data)) - w parametrze data, to co dostanie od controllera w responsie.

Takie coś nie będzie miało sensu jak pójdziesz do tej metody klasycznie, przez np: link zwykły, to np: spring będzie próbował to rozwiązać przez viewResolver.

1

W jaki sposób ma mu ten przykład zadziałać jak w metodzie w springu ma @RequestBody, którego metoda GET nie posiada.
Wiem że js doda to jako parametr requesta po znaku zapytania. Kolejne ma całkiem inne nazwy tej zmiennej, w js jakiś value, a w springu autocomplete, nie zmapuje mu.
A na koniec pod urlem */new metoda GET, zamiast POST.
Sprawdziłem ze spring bootem + Rest Client z chroma

Jestem jeszcze mało doświadczony i mogę się mylić, jeśli gdzieś w moim rozumowaniu jest błąd to go wskażcie to na przyszłość nie będę gadał głupot.

0

Zmieniłem na typ metody na post i faktycznie działa :)

0

A ja mam taki problem: korzystam z ModelAttribute i JSTL.
Oto kod jQuery:

 
$("#registerButton").click(function(){
		var registerForm=$("#registerForm").serialize();
		var request=$.ajax({
			type : "POST",
			url: "register",
			date: registerForm
			
		});
		request.done(function(){
			alert("Sukces");
		});
		request.fail(function(){
			alert("Nieudana próba")
		});

To kod w Javie:

 
@ResponseBody
	@RequestMapping(value="register",produces = "text/plain;charset=UTF-8",method=RequestMethod.POST)
	public String register(@ModelAttribute("client") Client client){
//kod metody
}


Niestety pola obiektu klasy client mają wartość null mimo wpisania w odpowiednie inputy danych.
Proszę o podpowiedż

1 użytkowników online, w tym zalogowanych: 0, gości: 1