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

@Autowired
   ConversionService conversionService;

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

konwertery mam w klasie:

@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

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

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:

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

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

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.

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)

    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:

@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

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 ;)

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