Minulla on yliopiston web-ohjelmointikurssiin liittyvä tehtävä, jonka kanssa olen tuskaillut monta päivää. Pitäisi pystyä tekemään metodi, joka luo uuden Game-tyyppisen olion, joka saa nimen ja id:n repositoryssa olevalta Game-oliolta. Tämän jälkeen repositoryssa oleva olio deletoidaan ja metodin pitää kuitenkin palauttaa uusi olio, jolla on siis sama nimi ja id kuin tuhotulla. Repositoryjen delete-metodit ovat voideja, eli ei voi kirjoittaa :
return gameRepository.delete(game);
(vaikka materiaalissa esitellään tällainen metodi, jonka pitäisi siis muka toimia). Teen siis projektia Netbeansilla, ja olennaista tässä on, että kaikki syötteet ja vasteet ovat JSON-muotoisia olioita. Olen yrittänyt myös importoida com.google.gson.Gson - riviä kodiin, Maven-dependency löytyy, mutta tällöin tulee silti joka kerta kompilaatiovirhe, pakkaus com.google.gson ei muka löydy.
Itse gson-syntaksi (game jsoniksi ja takaisin) olisi ehkä suht yksinkertainen. Olen aivan neuvoton tämän asian kanssa. Varmaan kyseessä on ihan aloittelijatason juttu mutta olisin silti tosi kiitollinen jos joku pystyisi neuvomaan tässä asiassa. Koko kurssin eteneminen tyssää muuten tähän, sillä tulevatkin tehtävät näyttäisi olevan sitä samaa rest-rajapinta-json-settiä.
Niin siis java-ohjelmontikieli on kyseessä.
En välttämättä tajunnut kysymystä, mutta mikä estää tekemästä:
gameRepository.delete(game); return game;
Jos tehtävänanto on julkisesti nähtävillä se varmasti selventää asiaa.
Joo siis en kertonut tarpeeksi tehtävästä. Kun luo uuden olion:
Game game = new Game();
niin sille voi antaa saman nimen kuin repositoryssa olevalla:
game.setName(name);
(name on polkumuuttuja metodin kutsussa), ja uusi Game saa siis helposti halutun nimen. Mutta id on hankalampi, sillä Game-oliolla ei ole setId()-metodia. Koko tehtävä pyörii JSON-datamuodon ympärillä, mutta en ymmärrä miten siihen pääsee käsiksi. Tässä itse tehtävä:
-----------------------
Toteuta pakkaukseen wad.controller luokka GameController, joka tarjoaa REST-rajapinnan pelien käsittelyyn:
•POST /games luo uuden pelin sille annetun pelin tiedoilla ja palauttaa luodun pelin tiedot. (Huom. vieläkin! Pyynnön rungossa oleva data on aina JSON-muotoista. Vastaukset tulee myös palauttaa JSON-muotoisina.)
•GET /games listaa kaikki talletetut pelit.
•GET /games/{name} palauttaa yksittäisen pelin tiedot pelin nimen perusteella.
•DELETE /games/{name} poistaa nimen mukaisen pelin. Palauttaa poistetun pelin tiedot.
---------------------------
On muutakin mutta tuo DELETE on siis tässä se mihin homma tyssää.
Kurssimateriaalissa on esimerkkimetodi:
@RequestMapping(value="/{id}", method=RequestMethod.DELETE) public Book deleteBook(@PathVariable Integer id) { return bookRepository.delete(id); }
Mutta tuohan ei yksinkertaisesti toimi, koska niinkuin alkup. viestissä todettiin, repositoryn delete-metodi ei palauta mitään. Entistä hämäävämpää, että materiaalissa on tällainen kohta. Tai sitten en vain tajua jotain yksityiskohtaa. Epäselvää joka tapauksessa.
Mod. lisäsi kooditagit ja vaihtoi otsikon!
Opettelet ilmeisesti Spring-alustan käyttämistä? Olisit voinut mainita sen aloitusviestissäsi, koska se helpottaa suuresti ongelmaan vastaamista.
En ole käyttänyt Springiä, mutta ilmeisesti Repositorysta voi poistaa olioita joko olion id:llä (repository.delete(game.getId())
tai oliolla itsellään repository.delete(game)
). Jos sinulla on jo game
-muuttuja, voisit toimia kuten c00d4r1 ehdottaa. Jos taas ei, voit ensin etsiä sen findOne
-metodilla:
Game game = gameRepository.findOne(id); gameRepository.delete(id); return game;
Kaikissa netistä löytämissäni esimerkeissä delete-metodi on void-tyyppinen. Koska Springissä on kuitenkin useita erilaisia repositoryja, saattaa kurssimateriaalisi viitata johonkin muuhun repositoryluokkaan kuin mitä itse käytät. Kannattaa joka tapauksessa ottaa yhteyttä kurssin järjestäjiin ja kertoa harhaanjohtavista ohjeista.
Koska metodi saa poistettavan pelin nimen, voit käyttää sitä id:n tapaan.
Game g = gameRepo.findByName(name); gameRepo.delete(g); return g;
Yritin itse asiassa noita menetelmiä, mutta ongelma on siinä, että kun game poistetaan repositorysta, häviää samalla myös viite. Eli tämä uusi Game game tai Game g vain aluksi VIITTAA repositoryssa olevaan olioon, sillä ei oikeastaan ole OMIA muuttujia name ja id. Tai näin ainakin tulkitsin testien statuserrorin: expected <200> but was <415>. Tämähän kai viittaa jonkin puuttumiseen.
Palautettava olio game pitäisi jotenkin muotoilla JSONina: { "id" : "123", "name" : "mikänyonkaan" } . Ja tämä pitäisi pystyä konvertoimaan Game-tyyppiseksi olioksi. Tuo GSON olio pystyy tähän, sen käyttö on helppoa ja tehtävässä olevat valmiit testitkin käyttävät sitä, mutta kun en saa sitä millään importuitua projektiin.
Mielenkiintoista. Käytä vaikka TMC:n pastebin ominaisuutta niin voin katsoa tarkemmin mikä koodissa mättää.
Eikun ongelma saattoikin johtua siitä, että oli määritellyt Game-oliolle myös oman Private listin, mistä en muistanut mainita, se saattaa sotkea koko jutun. Yritän ensin saada ohjelmaa toimimaan hankkiutumalla eroon siitä, palaan asiaan jos ei onnistu. Mutta kiitos kuitenkin avusta.
Joo, elikkä c00d4r1 ja fergusq olivat täysin oikeassa noiden ehdotustensa kanssa. DELETE-metodin voi tehdä noin, aiemmat puheeni viittauksen häviämisestä olivat potaskaa. Kyllä olion voi siis palauttaa deletoimisen jälkeen, vika oli muualla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.