Comment injecter une dépendance guice dans l'interface mapstruct - Java

Nov 10 2020

Mes objets

 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
}

J'ai une 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);

}

Je prévois d'injecter ce gson au lieu du nouveau Gson ()

En conséquence, comment puis-je combiner Guice et Mapstruct?

J'ai essayé d'apporter des modifications mais je ne sais pas où ajouter cela

@Inject
Gson gson

J'ai essayé comme ça

public interface TestjkMapper {

  @Inject
  Gson gson

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

}

Je reçois une erreur du compilateur comme ci-dessous

variable gson might not have been initialized

comment injecter correctement dans cette interface

Ici aussi

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

TestjkMapper - Mon interface

TestjkMapperImpl - Ceci est généré au moment de l'exécution. Alors je ne sais pas comment lier ça

Question exacte:

Comment convertir un étudiant objecten étudiant en Stringutilisant guice injectégson

Réponses

Filip Nov 11 2020 at 18:27

Si vous souhaitez utiliser des composants injectés personnalisés dans vos mappeurs, vous devrez utiliser des classes abstraites au lieu d'interfaces. Vous ne pouvez pas injecter de champs dans les interfaces.

Dans votre exemple, cela ressemblera à:

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

}