Jak wstrzyknąć zależność od guice do interfejsu mapstruct - Java

Nov 10 2020

Moje przedmioty

 Public void Student(){
     private string name;
     private int age;
 }

Public void ClassRoom(){
   private string roomNo;
   private Student student; //Student Object
}

Public void School(){
   private string roomNo;
   private String student; //String student
}

Mam interfejs

@Mapper(componentModel = "jsr330", unmappedTargetPolicy = ReportingPolicy.IGNORE, builder = @Builder(disableBuilder = true))
public interface TestjkMapper {

    @Named("convertObjToString")
    static String convertObjToString(Student student) {
        return new Gson.tojson(student)
    }

   @Mapping(source = "student", target = "student",qualifiedByName = "convertObjToString")
   School mapClassRoomToSchool(@NonNull ClassRoom classRoom);

}

Planuję wstrzyknąć ten gson zamiast nowego Gson ()

Zgodnie z tym Jak mogę połączyć Guice i Mapstruct?

Próbowałem wprowadzić zmiany, ale nie byłem pewien, gdzie to dodać

@Inject
Gson gson

Próbowałem w ten sposób

public interface TestjkMapper {

  @Inject
  Gson gson

    @Named("authorityToMap")
    static Map authorityToMap(Authority authority) {
        return gson.tojson(authority.tostring())
    }

}

Otrzymuję błąd kompilatora, jak poniżej

variable gson might not have been initialized

jak poprawnie wstrzyknąć wewnątrz tego interfejsu

Także tutaj

bind(TestjkMapper.class).to(TestjkMapperImpl.class)

TestjkMapper - Mój interfejs

TestjkMapperImpl - jest generowany w czasie wykonywania. Więc nie wiem, jak to związać

Dokładne pytanie:

Jak przekonwertować studenta objectna studenta Stringza pomocą wstrzykniętego guicegson

Odpowiedzi

Filip Nov 11 2020 at 18:27

Jeśli chcesz użyć niestandardowych wstrzykniętych składników w mapperach, będziesz musiał użyć klas abstrakcyjnych zamiast interfejsów. Nie możesz wstrzykiwać pól do interfejsów.

W Twoim przykładzie będzie to wyglądać następująco:

@Mapper(componentModel = "jsr330", unmappedTargetPolicy = ReportingPolicy.IGNORE, builder = @Builder(disableBuilder = true))
public abstract class TestjkMapper {

    @Inject
    Gson gson;

    @Named("convertObjToString")
    static String convertObjToString(Student student) {
        return gson.tojson(student)
    }

   @Mapping(source = "student", target = "student", qualifiedByName = "convertObjToString")
   School mapClassRoomToSchool(@NonNull ClassRoom classRoom);

}