【问题标题】:Mapstruct: inherintace cycle dependencyMapstruct:继承循环依赖
【发布时间】:2022-01-16 23:00:15
【问题描述】:

这些是我的相关课程:

public abstract class Element {
    private List<Extension> extension;
}

public abstract class Type extends Element {

}

public abstract class PrimitiveType<T> extends Type {
    private T value;
}

public class UriType extends PrimitiveType<String> {
    
}

public class Extension extends Type {
    private UriType url;
}

如你所见:

                                             < PrimitiveType < UriType
Element (*extension: List<Extension>) < Type
                                             < Extension (*url: UriType)

我在启动 Spring Boot 服务时收到此消息:

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

   ca.uhn.fhir.spring.boot.autoconfigure.FhirAutoConfiguration$FhirRestfulServerConfiguration
      ↓
   patientResourceProvider defined in file [/home/jeusdi/projects/salut/mpi/hes-mpi-fhir-mongodb/target/classes/cat/gencat/catsalut/hes/mpi/providers/PatientResourceProvider.class]
      ↓
   patientService defined in file [/home/jeusdi/projects/salut/mpi/hes-mpi-fhir-mongodb/target/classes/cat/gencat/catsalut/hes/mpi/service/PatientService.class]
      ↓
   patientMapperImpl defined in file [/home/jeusdi/projects/salut/mpi/hes-mpi-fhir-mongodb/target/classes/cat/gencat/catsalut/hes/mpi/mapper/PatientMapperImpl.class]
┌─────┐
|  extensionMapperImpl defined in file [/home/jeusdi/projects/salut/mpi/hes-mpi-fhir-mongodb/target/classes/cat/gencat/catsalut/hes/mpi/mapper/ExtensionMapperImpl.class]
↑     ↓
|  uriTypeMapperImpl defined in file [/home/jeusdi/projects/salut/mpi/hes-mpi-fhir-mongodb/target/classes/cat/gencat/catsalut/hes/mpi/mapper/UriTypeMapperImpl.class]

UriTypeMapperExtensionMapper 具有循环依赖关系。

问题是Extension 类有一个url: UriTypeUriType 继承自包含ElementList&lt;Extension&gt;

ExtensionMapper 是:

@Mapper(
    uses = { 
        UriTypeMapper.class
    }
)
public interface ExtensionMapper {

    @Mapping(target = "url", source = "urlElement")
    Extension fhirToMpi(org.hl7.fhir.r4.model.Extension fhirType);

}

UriTypeMapper 是:

@Mapper(
    config = GenericMapperConfig.class,
    uses = { ExtensionMapper.class }
)
public interface UriTypeMapper {

    UriType fhirToMpi(org.hl7.fhir.r4.model.UriType uriType);

}

我不太清楚如何避免这种行为,因为Extension 需要一个UriTypeMapper 来映射Extension.url 字段,而UriType 需要ExtensionMapper 因为它从@987654341 继承extension 字段@类。

关于如何安排它的任何想法?

【问题讨论】:

    标签: mapstruct


    【解决方案1】:

    打破循环依赖的唯一方法是将多个映射放在同一个映射器中。

    例如

    @Mapper(
        config = GenericMapperConfig.class
    )
    public interface UriTypeMapper {
    
        UriType fhirToMpi(org.hl7.fhir.r4.model.UriType uriType);
    
        @Mapping(target = "url", source = "urlElement")
        Extension fhirToMpi(org.hl7.fhir.r4.model.Extension fhirType);
    
    }
    

    【讨论】:

      【解决方案2】:

      休息

      要“从面向对象上骑马”。

      那个(继承/依赖)循环:

      public abstract class Element { // <- parent
          private List<Extension> extension; // <- child!!! (in java legal, but anywhere else:) yuk!
      

      正确:

      public abstract class Element { // <- parent
        private List<? extends Element> extension; // This is ok! no cylce! (less "pervert";)
      

      现在取决于您的项目规模/细节...

      也可行:

      public abstract class Element { 
          private List<ExtensionI> extension; // some ...
      }
      -------
      public class Extension extends Type implements ExtensionI { // ..interface
      }
      ------
      public interface ExtendsionI {} // which both depend on.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 2014-08-28
        相关资源
        最近更新 更多