Como injetar dependência guice na interface mapstruct - java

Nov 10 2020

Meus objetos

 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
}

Eu tenho uma interface

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

}

Estou planejando injetar esse gson em vez do novo Gson ()

De acordo com isso, como posso combinar Guice e Mapstruct?

Tentei fazer alterações, mas não tenho certeza de onde adicionar

@Inject
Gson gson

Eu tentei assim

public interface TestjkMapper {

  @Inject
  Gson gson

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

}

Estou recebendo um erro do compilador conforme abaixo

variable gson might not have been initialized

como injetar corretamente dentro dessa interface

Aqui também

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

TestjkMapper - Minha interface

TestjkMapperImpl - gerado no tempo de execução. Então, não tenho certeza de como vincular isso

Pergunta exata:

Como converter aluno objectem aluno Stringusando guice injetadogson

Respostas

Filip Nov 11 2020 at 18:27

Se você deseja usar componentes injetados personalizados em seus mapeadores, você precisará usar classes abstratas em vez de interfaces. Você não pode injetar campos em interfaces.

No seu exemplo, será semelhante a:

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

}