Vitin
Vitin
#naukaprogramowania #java #spring #javascript

W jaki sposób wysłać JSowy array tak, by spring mvc go zobaczył w @RequestParam? Próbowałem już na wszystkie sposoby, żaden nie działa ;/
Po stronie JSa mam:

$.ajax({
url: "api/board/set/",
method: "POST",
data: {fields: fields} //fields to array booleanów
})

Po stronie Springa ("api/board/" jest nad klasą, zresztą logi z Trace pokazują że metodę znajduje, tylko parametrów nie potrafi dopasować)

@RequestMapping(value = "set", method = RequestMethod.POST)
public HttpEntity setBoard(@RequestParam() Boolean[] fields) {

Próbowałem @RequestParam("fields"), @RequestParam("fields[]"), List, Boolean[], Object, @RequestBody Board (gdzie board to prowizoryczny wrapper arraya booleanów), nic nie działa.
Próbowałem po stronie JS: stringify wszystko i contentType app/json, stringify sam array fields (z headerem contentType: app/json i bez), bez konwertowania, wszystkie kombinacje, nie działa :(

Cały czas 400 albo w skrajnych przypadkach gdy chcę łapać @RequestBody a wysyłam bez sparsowania do JSONa 415.
edit: zapomniałem, a w sumie najważniejsze xD response.status(): "Required Boolean[] parameter 'fields' is not present"
  • Najlepsze
  • Wszystkie komentarze
fegwegw
@Vitin: No i dlatego nie jesteś w stanie zserializować go do Listy, bo on nie ma formatu listy.

http://stackoverflow.com/questions/20837856/can-not-deserialize-instance-of-java-util-arraylist-out-of-start-object-token

Tu masz mniej więcej opisany problem.
fegwegw
@Vitin: Wyślij jako json, a do RequestMapping dodaj 'consumes = MediaType.APPLICATIONJSONVALUE' i daj znać czy zarobiło.
fegwegw
@Vitin: O, albo sprawdź List param, zamiast Boolean[], powinno robić z defaultu. Chyba.
Vitin
Vitin
Vitin Autor
0
@fegwegw: List sprawdzałem jako jedno z pierwszych,
Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
fegwegw
@Vitin: No bo pewnie json ma niepoprawny format.

http://jsonlint.com/

I wklej cały exception.
Vitin
Vitin
Vitin Autor
0
@fegwegw: sprawdzałem, json jest poprawny, zresztą nie piszę go przecież z ręki ;d

Vitin
Vitin
Vitin Autor
0
@fegwegw: MediaType nie pomogło
Vitin
Vitin
Vitin Autor
0
@fegwegw: jedynie jak mogę łapać w tym momencie to Map, gdzie String to nazwa parametru a Boolean[] to ten array, ale to głupie, bo chcę poza arrayem Booleanów chcę dać np drugi parametr który jest intem. Mógłbym generyki, ale to chyba głupie :D
fegwegw
@Vitin: A wklej jsona, jakiego wysyłasz.
c.....k
c.....k
@Vitin: A spróbuj zamiast RequestParam dać RequestBody, razem z consumes MediaType.APPLICATIONJSONVALUE.
Vitin
Vitin
Vitin Autor
0
@chuuck: tak jest teraz, muszę łapać Map
@fegwegw: @chuuck: Nie ma mnie już przy kompie, ale json wygląda tak
{"fields": [false,true,false, false], "width": 2}
Pisze z pamieci wiec ten może mieć jakieś błędy, ale ten generowany i wysyłany sprawdzałem na jsonlint, jest poprawny. A w uproszczonym przykładzie na którym testuje jest po prostu
{"fields": [false,true,false, false]}

Teraz moim problemem jest to, że RequestBody wrapuje tego jsona
Vitin
Vitin
Vitin Autor
0
@fegwegw: okej, już rozumiem, ale przesyłając w ten sposób sam czysty array nie mogę już przesłać nic więcej, prawda?
c.....k
c.....k
@Vitin A objectmappera z jacksona do mappowania jsona używasz czy próbujesz ręcznie zmapować? Takie coś trafiłem, może Ci się przyda.
Vitin
Vitin
Vitin Autor
0
@fegwegw: @chuuck: albo już ostatnie pytanie, jak powinien wyglądać json, żebym mógł zrobić metodę w spring controlerze foo(Boolean[] b, Integer i)?
fegwegw
@Vitin: Możesz, ale musisz zadeklarować, że zamiast List przyjmujesz List, który strukturą będzie odpowiadał otrzymanemu jsonowi.

http://www.leveluplunch.com/java/tutorials/014-post-json-to-spring-rest-webservice/ to powinno rozjaśnić trochę temat.
Vitin
Vitin
Vitin Autor
0
@chuuck: liczę na springa mvc że zrobi to za mnie, ale nie układa nam się trochę współpraca :c
c.....k
c.....k
@Vitin Ewentualnie osobne funkcje do mappowania jak tutaj.
Vitin
Vitin
Vitin Autor
0
@fegwegw: Okej, dzięki wielkie, po prostu myślałem że.wysylajac dwa obiekty będę w stanie złapać dwa obiekty osobno. Jak widać się nie da tak prosto jak myślałem :(