2016-11-26 57 views
1

嘗試映射我的域對象時,出現以下StackOverflowError異常。我試圖忽略導致循環依賴的屬性無濟於事。映射處理器中的內部錯誤:java.lang.StackOverflowError

我的領域模型的中心是WorkoutSet,它有一個用戶和一個練習。

如果我從WorkoutSetMapper中移除了映射註釋,那麼將按照預期生成UserMapperImpl和ExerciseMapperImpl。

Error:(15, 1) java: Internal error in the mapping processor: java.lang.StackOverflowError at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:786) at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4652) at com.sun.tools.javac.code.Types.supertype(Types.java:2315) at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1966) at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1955) at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:786) at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4571) at com.sun.tools.javac.code.Types.asSuper(Types.java:1952) at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1968) at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1955) at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:786) at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4571) at com.sun.tools.javac.code.Types.asSuper(Types.java:1952) at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1975) at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1955) at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:786) at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4571) at com.sun.tools.javac.code.Types.asSuper(Types.java:1952) at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1975) at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1955) at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:786) at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4571) at com.sun.tools.javac.code.Types.asSuper(Types.java:1952) at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1975) at com.sun.tools.javac.code.Types$13.visitClassType(Types.java:1955) at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:786) at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4571) at com.sun.tools.javac.code.Types.asSuper(Types.java:1952) at com.sun.tools.javac.code.Types$4.visitClassType(Types.java:921) at com.sun.tools.javac.code.Types$4.visitClassType(Types.java:844) at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:786) at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4571) at com.sun.tools.javac.code.Types.isSubtype(Types.java:840) at com.sun.tools.javac.code.Types.isSubtype(Types.java:804) at com.sun.tools.javac.model.JavacTypes.isSubtype(JavacTypes.java:98) at org.mapstruct.ap.internal.util.workarounds.SpecificCompilerWorkarounds.isSubtype(SpecificCompilerWorkarounds.java:76) at org.mapstruct.ap.internal.util.workarounds.TypesDecorator.isSubtype(TypesDecorator.java:68) at org.mapstruct.ap.internal.model.common.Type.isSubType(Type.java:638) at org.mapstruct.ap.internal.model.common.Type.isCollection(Type.java:628) at org.mapstruct.ap.internal.model.common.Type.isCollectionOrMap(Type.java:624) at org.mapstruct.ap.internal.model.common.Type.getAlternativeTargetAccessors(Type.java:598) at org.mapstruct.ap.internal.model.common.Type.getPropertyWriteAccessors(Type.java:419) at org.mapstruct.ap.internal.model.source.TargetReference$BuilderFromTargetMapping.getTargetEntries(TargetReference.java:144) at org.mapstruct.ap.internal.model.source.TargetReference$BuilderFromTargetMapping.build(TargetReference.java:120) at org.mapstruct.ap.internal.model.source.Mapping.init(Mapping.java:227) at org.mapstruct.ap.internal.model.source.SourceMethod$Builder.build(SourceMethod.java:207) at org.mapstruct.ap.internal.processor.MethodRetrievalProcessor.getMethodRequiringImplementation(MethodRetrievalProcessor.java:257) at org.mapstruct.ap.internal.processor.MethodRetrievalProcessor.getMethod(MethodRetrievalProcessor.java:193) at org.mapstruct.ap.internal.processor.MethodRetrievalProcessor.retrieveMethods(MethodRetrievalProcessor.java:148) at org.mapstruct.ap.internal.processor.MethodRetrievalProcessor.retrieveMethods(MethodRetrievalProcessor.java:163) at org.mapstruct.ap.internal.processor.MethodRetrievalProcessor.retrieveMethods(MethodRetrievalProcessor.java:163) at org.mapstruct.ap.internal.processor.MethodRetrievalProcessor.retrieveMethods(MethodRetrievalProcessor.java:163) at org.mapstruct.ap.internal.processor.MethodRetrievalProcessor.retrieveMethods(MethodRetrievalProcessor.java:163) at org.mapstruct.ap.internal.processor.MethodRetrievalProcessor.retrieveMethods ...

我的域類如下

  @Entity 
      public class User implements FirstClassDomainObject { 
       @Id 
       @GeneratedValue(strategy = GenerationType.IDENTITY) 
       private long id; 
       private String name; 
       private String email; 
      ... 

      @Entity 
      public class Exercise implements FirstClassDomainObject { 
       @Id 
       @GeneratedValue(strategy = GenerationType.IDENTITY) 
       private long id; 
       private String name; 
       private String description; 
      ... 

      @Entity 
      public class WorkoutSet implements FirstClassDomainObject { 
       @Id 
       @GeneratedValue(strategy = GenerationType.IDENTITY) 
       private long id; 
       private int repetition; 
       private double wight; 
       private LocalDateTime timestamp; 
       @ManyToOne 
       private Exercise exercise; 
       @ManyToOne 
       private User user; 
      ... 

我DTO類如下

  public class UserResource implements ResourceObject { 
       private Long id; 
       private String name; 
       private String email; 
      ... 

      public class ExerciseResource implements ResourceObject { 
       private String name; 
       private String description; 
      ... 

      public class WorkoutSetResource implements ResourceObject { 
       private int repetition; 
       private double wight; 
       @JsonSerialize(using = LocalDateTimeSerializer.class) 
       private LocalDateTime timestamp; 
       private ExerciseResource exercise; 
       private UserResource user; 
      ... 

我的映射器接口是如下

  @Mapper(componentModel = "spring") 
      interface UserMapper extends ClassMapper<User, UserResource> { 
       @Override 
       default List<Class<?>> getSupportedClasses() { 
        return Lists.newArrayList(User.class, UserResource.class); 
       } 
      } 


      @Mapper(componentModel = "spring") 
      interface ExerciseMapper extends ClassMapper<Exercise, ExerciseResource> { 
       @Override 
       default List<Class<?>> getSupportedClasses() { 
        return Lists.newArrayList(Exercise.class, ExerciseResource.class); 
       } 
      } 

      @Mapper(componentModel = "spring", uses = {UserMapper.class, WorkoutSetMapper.class}) 
      interface WorkoutSetMapper extends ClassMapper<WorkoutSet, WorkoutSetResource> { 
       @Override 
       default List<Class<?>> getSupportedClasses() { 
        return Lists.newArrayList(WorkoutSet.class, WorkoutSetResource.class); 
       } 
      } 

的ClassMapper被定義如下

  public interface ClassMapper<D extends DomainObject, R extends ResourceObject> { 
       R map(D domainObject); 
       D map(R resourceObject); 
       List<Class<?>> getSupportedClasses(); 
      } 

我已經離開了getter和setter方法,以避免文字的牆上,但整個代碼庫都可以在這裏找到https://github.com/tonsV2/Lift-Log-Backend。 關於我做錯了什麼的線索?

+0

看起來你有你的對象 –

+0

呀循環引用,但我怎麼防止mapstruct從以下呢? – user672009

+0

我不知道。我只是不認爲你應該有一個用戶持有一套鍛鍊,而這又反過來指向擁有它們的用戶。類似於練習。 –

回答

2

我發現了錯誤!我已經設置了WorkoutSetMapper來使用它自己。

@Mapper(componentModel = "spring", uses = {UserMapper.class, WorkoutsetMapper.class}) 
interface WorkoutSetMapper extends ClassMapper<WorkoutSet, WorkoutSetResource> { 

雖然我應該有

@Mapper(componentModel = "spring", uses = {UserMapper.class, ExerciseMapper.class}) 
interface WorkoutSetMapper extends ClassMapper<WorkoutSet, WorkoutSetResource> {