Konwerter w konwerterze

Konwerter w konwerterze
0

Mam problem z 2 encjami tj. Book i Shelf. Shelf ma liste ksiazek. Nie wysyłam w metodzie @GetMapping Book, tylko konwertuje ją na postać BookResponse i w takiej postaci zwracam. Tak samo robie z Shelf. Problemem jest, to że w konwerterze ShelfConverter chciałbym przekonwertować listę books, na liste booksResponse, ale wtedy musiałbym wstrzyknąc do konwerteraShelf

Kopiuj
@Autowired
   ConversionService conversionService;

niemniej jednak conversionService nie jest wstrzykiwany tj. dostaje null'a :(

konwertery mam w klasie:

Kopiuj
@Configuration
public class ConversionConfig {

    private Set<Converter> getConverters() {
        Set<Converter> converters = new HashSet<>();
        converters.add(new BookToBookResponseConverter());
        converters.add(new ShelfToShelfResponseConverter());
 
        return converters;
    }

    @Bean
    public ConversionService conversionService() {
        ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
        bean.setConverters(getConverters());
        bean.afterPropertiesSet();

        return bean.getObject();
    }
}

Jak mogę to ominąć ?

0

udało się to rozwiązać przez stworzenie instancji klasy konwertujacej, mimo wszystko jakby ktos mial ladniejszy pomysl to z checia bym go zobaczyl

hcubyc
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 2 lata
0

Co jest złego w wstrzykiwaniu konwertera, a nie przez magię Springa? Co więcej twój serwis, który zwraca Book mógłby od razu zwracać BookResponse


Limitations are limitless > ##### Ola Nordmann napisał(a)
> Moim językiem ojczystym jest C++ i proszę uszanować to, że piszę po polsku.
0

Tzn nie chodzi o to, ze coś mi się nie podoba ze wstrzykiwaniem - po prostu wywalalo mi nullptrexception i szukalem rozwiazania :P Nie działało, kiedy do mojej klasy konwertującej chciałem wstrzyknąć ConverterService, aby moc skorzystac z mojego drugiego konwertera co może jest troche głupię bo wstrzykiwalbym ConverterService, ktory ma m.in konwerter, którego potrzebuje i owy konwerter, w którym robie wstrzykiwanie :D brzmi okropnie

0

dla łatwiejszego zobrazowania:

Kopiuj
@Component
public class ShelfToShelfResponseConverter implements Converter<Shelf, ShelfResponse> {
@Autowired 
ConverterService converterService
// ..
}

@Component
public class BookToBookResponseConverter implements Converter<Book, BookResponse> {
// ..
}

hcubyc
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 2 lata
0

Okej, próbujesz wstrzyknąć ConversionService, ale dostajesz nulla. Jeżeli klasa, do której masz wstrzyknąć jest dobrze 'skonfigurowana' tzn mam na myśli adnotacje i np. inne rzeczy są wstrzykiwane to sprawdziłbym debuggerem czy po starcie aplikacji ConversionService jest w środowisku springowym - może ci omija z jakiegoś powodu.
Co do kodu, który teraz wstawiłeś masz tam ConverterService , ale nie wiem co to jest. Ty powinieneś korzystać z ConversionService, tylko nie ma sensu wstrzykiwać go do konwertera. I to co napisałeś co sam określiłeś, że brzmi okropnie to nie zrozumiałem nic z tego, ale konwertery nie muszą być adnotowane jako @Component.


Limitations are limitless > ##### Ola Nordmann napisał(a)
> Moim językiem ojczystym jest C++ i proszę uszanować to, że piszę po polsku.
0

pomylilem sie, mialem tam ConversionService :P

Nie za bardzo znam wiem jak spring robi DI, ale wydaje mi się, że dostaje null'a dlatego bo w configu najpierw zwracany jest wynik z "getConverters()" (w tej metodzie jest tworzona instancja mojego konwertera)

Kopiuj
    private Set<Converter> getConverters() {
        Set<Converter> converters = new HashSet<>();
        converters.add(new BookToBookResponseConverter());
        converters.add(new ShelfToShelfResponseConverter()); // <- jesli DI jest tylko przy tworzeniu instancji, to nie ma prawa byc wstrzykniety ConversionService bo jeszcze nie powstal
        
        return converters;
    }

a bean ConversionService tworzony jest póżniej tj:

Kopiuj
@Bean
 public ConversionService conversionService() {
        ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
        bean.setConverters(getConverters());  // pobieram moje konwertery
        bean.afterPropertiesSet();

        return bean.getObject();
    }

Można jakoś to ponownie wstrzyknąć przez springa?
Dzieki za pomoc! Jakos udalo mi sie obejsc ten problem w mniej elegancki sposob, ale dzieki Twoim sugestiom udało mi się przynajmniej zweryfikowac zrodlo takiego stanu rzeczy

hcubyc
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 2 lata
0

W swoich klasach (olej jak to zostało w Springu czasami rozwiązane) wstrzykuj tylko przez konstruktor.
w metodzie getConverters() nie ma żadnego DI. Ty tam tworzysz nową instancję ręcznie, jakbyś chciał to przez Springowe DI to byś musial w metodzie conversionService() oznaczonej jako @Bean dodać parametr List<MyFilter<? extends Converter>> converters. Tylko to by ci się nie powiodło, bo Spring wykmini, że potrzebuje twoich Converterów, żeby utworzyć ConversionService, ale twoje convertery wymagają ConversionService, który ma być zaraz stworzony, czyli jeden z największych błędów w programowaniu - cykl. Generalnie po co ci ConversionService wewnątrz Convertera? Jeżeli jest ci on niepotrzebny, to kod który masz będzie działać

Ciesze się, że pomogłem ;)


Limitations are limitless > ##### Ola Nordmann napisał(a)
> Moim językiem ojczystym jest C++ i proszę uszanować to, że piszę po polsku.
edytowany 1x, ostatnio: hcubyc
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)