mapowanie obiektów Springboot

0

Mam service oraz model.
Chciabym zainicjalizować ten obiekt i nadać polom wartości, które do mnie przychodzą. Czemu obiekt nie chce się zainicjalizować?

@Service
public class DownloadData {

    public DownloadData(RestTemplate restTemplate, UriBuilderHelper uriBuilderHelper, Model moddel) {
        this.restTemplate = restTemplate;
        this.uriBuilderHelper = uriBuilderHelper;
        this.model = model;
    }

    private RestTemplate restTemplate;
    private UriBuilderHelper uriBuilderHelper;
    private Model mode;


    public String gitDetailsInformation(String owner, String repository) throws MalformedURLException {

        ResponseEntity<String> response = restTemplate.getForEntity(uriBuilderHelper.uriBuilder(owner, repository), String.class);

        DocumentContext responseJson = JsonPath.parse(response.getBody());
       
       //bean nie jest inicjalizowany, jest nullem
        model.setName(responseJson.read("$.full_name").toString())

        return response.toString();
    }

}
public class Model {

    String name;
    int age;

    public Model(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
1

Nie działa dlatego, że Model nie jest oznaczony jako @Component.

Jest dosyć późno i nie bardzo jestem w stanie zrozumieć, co chcesz zrobić, ale trzymanie tak stanu, który zmieni się przy każdym wywołaniu metody w singletonie springowym to nie jest dobry pomysł

0

@TakiTamDeveloper:
to jak to zrobic poprawnie?

  1. Musze zwrocic obiekt Model
  2. Buduje go sobie na podstawie jsona, ktorego otrzymuje w response.
  3. Jsona wyciagam sobie tylko pola, ktore mnie interesuje tj. name i age
  4. Zwracam sobie tak zbudowany obiekt w controllerze.

dodatkowym zalozeniem jest, zeby aplikacja obslugiwala 10 zapytan/s.

Za kazda wskazowke, bede bardzo wdzieczny.

0

jak odbierasz coś z restTemplate, to zwracaj encję z metody getDetailsInformation, zamiast Stringa z response. Czyli twórz na nowo obiekt Model (warto pomyśleć nad zmianą nazwy), najlepiej immutable (pola final, inicjalizacja w konstruktorze) i zwracaj z metody.

Zastanawiam się też, jak często zmieniają się dane, które pobierasz restem. Jeżeli rzadko, to warto pomyśleć nad mechanizmem cache - ze względu na performance (10 zapytań/s). Ale na początku na Twoim miejscu po prostu bym włączył i sprawdził, czy działa, a optymalizacjami będziesz martwić się potem.

0

Masz literówki, chyba, że piszesz z palca ("Model moddel, this.model = model;, private Model mode;,").

0

@TakiTamDeveloper:
Dzieki za poprzednia odpowiedz;)

public Model gitDetailsInformation(String owner, String repository) throws MalformedURLException {

        ResponseEntity<Model> response = restTemplate.getForEntity(uriBuilderHelper.uriBuilder(owner, repository), Model.class);

        DocumentContext responseJson = JsonPath.parse(response.getBody());
        model.setName(responseJson.read("$.full_name").toString())
        return response.toString();
    }

Po zmianie na dany obiekt, psuje sie serializacja:
failed; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/exc/InvalidDefinitionException] with root cause

java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_181]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_181]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) ~[na:1.8.0_181]

Co robie zle?

0

próbujesz zdeserializować odpowiedź do klasy Model i jest z tym jakiś problem. Nie do końca wiadomo jaki, bo nie masz na classpath klasy wyjątku, który program próbuje rzucić. Klasa wyjątku jest w module jackson-databind (https://fasterxml.github.io/jackson-databind/javadoc/2.9/com/fasterxml/jackson/databind/exc/InvalidDefinitionException.html), dodaj go do zależności projektu.

Poza tym, jeżeli już będziesz deserializował do Model, to nie musisz potem jeździć JsonPath, bo właściwe dane wyląduję w polach obiektu klasy Model podczas deserializacji

0

mam pole dokladnie nazwane full_name w Model:

public Model gitDetailsInformation(String owner, String repository) throws MalformedURLException {

        ResponseEntity<Model> response = restTemplate.getForEntity(uriBuilderHelper.uriBuilder(owner, repository), Model.class);

        DocumentContext responseJson = JsonPath.parse(response.getBody());
        model.setName(responseJson.read("$.full_name").toString())
        return response.toString();
    }

i twierdzi ze takiego pola nie ma
2019-04-12 1726.460 ERROR 15484 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.jayway.jsonpath.PathNotFoundException: Expected to find an object with property ['full_name'] in path $ but found 'com.model.GitModelDetails'. This is not a json object according to the JsonProvider: 'com.jayway.jsonpath.spi.json.JsonSmartJsonProvider'.] with root cause

Jak sobie robie systemout to go widze, a to jest dokladnie ten sam json, ktorego sie spodziewam:
https://api.github.com/repos/octocat/Hello-World

0

przeciez getBody() nie zwróci String tylko obiekt klasy Model, który ma 2 pola - name i age. Zrób klasę Model z polami nazwanymi tak, żeby Jackson miał szansę zdeserializować te dane, które Cię interesują i wyrzuć niepotrzebne parsowanie JsonPath. W tym wypadku pole pewnie powinno nazywać się fullName (strzelam).

0

@TakiTamDeveloper: rozumiem, ze resttemplate jest na tyle madry, ze znajduje sobie odpowiednie pola i sobie je mapuje na nowy obiekt?

i teraz tak, mam :

gitModelDetails.getClass()

ten obiekt ma headery i body. W body mam 2 pola, tak jak chcialem, ale sa nullami,
Robilem rozne kombinacje full_name, fullName, fullname etc.
Z description jest ten sam problem, chociaz tutaj nie powinno byc watpliwosci.

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