Cómo inyectar la dependencia de guice en la interfaz de mapstruct - java

Nov 10 2020

Mis 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
}

Tengo una interfaz

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

}

Estoy planeando inyectar ese gson en lugar de nuevo Gson ()

Según esto, ¿cómo puedo combinar Guice y Mapstruct?

Traté de hacer cambios pero no estoy seguro de dónde agregar eso

@Inject
Gson gson

Lo intenté así

public interface TestjkMapper {

  @Inject
  Gson gson

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

}

Recibo un error del compilador como se muestra a continuación

variable gson might not have been initialized

cómo inyectar correctamente dentro de esa interfaz

Aqui tambien

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

TestjkMapper - Mi interfaz

TestjkMapperImpl: se genera en tiempo de ejecución. Así que no estoy seguro de cómo unir esto

Pregunta exacta:

Cómo convertir de estudiante objecten estudiante Stringusando guice inyectadogson

Respuestas

Filip Nov 11 2020 at 18:27

Si desea utilizar componentes inyectados personalizados en sus mapeadores, deberá utilizar clases abstractas en lugar de interfaces. No puede inyectar campos en interfaces.

En su ejemplo, se verá así:

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

}