2017-11-04 14 views
0

이 소스에서 애플리케이션을 다운로드했습니다. https://github.com/springframeworkguru/spring5-mvc-rest/tree/vendor-api MapStruct에 문제가 있습니다.MapStruct - @Mapper annotation은 빈을 생성하지 않습니다.

@Mapper 
public interface CategoryMapper { 

CategoryMapper INSTANCE = Mappers.getMapper(CategoryMapper.class); 


CategoryDTO categoryToCategoryDTO(Category category); 

}

@Data 
public class CategoryDTO { 
    private Long id; 
    private String name; 
} 

도메인 클래스 :

@Data 
@Entity 
public class Category { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private String name; 
} 

서비스 클래스 :

@Service 
public class CategoryServiceImpl implements CategoryService { 

    private final CategoryMapper categoryMapper; 
    private final CategoryRepository categoryRepository; 

    public CategoryServiceImpl(CategoryMapper categoryMapper, CategoryRepository categoryRepository) { 
     this.categoryMapper = categoryMapper; 
     this.categoryRepository = categoryRepository; 
    } 
} 

와의 pom.xml 의존성에

, 나는 두 붙여 ::

을3210
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
    <java.version>1.8</java.version> 
    <org.mapstruct.version>1.2.0.CR2</org.mapstruct.version> 
</properties> 
<dependency> 
     <groupId>org.mapstruct</groupId> 
     <artifactId>mapstruct-jdk8</artifactId> 
     <version>${org.mapstruct.version}</version> 
</dependency> 

그리고 플러그인 :

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.7.0</version> 
    <configuration> 
     <source>1.8</source> 
     <target>1.8</target> 
     <annotationProcessorPaths> 
      <path> 
       <groupId>org.projectlombok</groupId> 
       <artifactId>lombok</artifactId> 
       <version>${lombok.version}</version> 
      </path> 
      <path> 
       <groupId>org.mapstruct</groupId> 
       <artifactId>mapstruct-processor</artifactId> 
       <version>${org.mapstruct.version}</version> 
      </path> 
     </annotationProcessorPaths> 
     <compilerArgs> 
      <compilerArg> 
       -Amapstruct.defaultComponentModel=spring 
      </compilerArg> 
     </compilerArgs> 
    </configuration> 
</plugin> 

설명 :

Parameter 0 of constructor in 
guru.springfamework.services.CategoryServiceImpl required a bean of type 'guru.springfamework.api.v1.mapper.CategoryMapper' that could not be found. 

작업 :

Consider defining a bean of type 'guru.springfamework.api.v1.mapper.CategoryMapper' in your configuration. 

내 IntelliJ를 주석에 @Mapper가 빈을 생성하지 않는 생각 매퍼. John GitHub에서 코드를 변경하지 않았습니다. 아이디어가 있으십니까? 경로 생성 소스를 대상으로 변경하려고 시도했지만 도움이되지 않습니다. 도움을 주셔서 감사합니다.

+0

intellij 기본 설정에서 주석 처리가 활성화되어 있는지 확인하십시오. – wsl

+0

예. 사용할 수 있습니다. – Kutti

+0

이상하게도, 예제 브랜치 mapstruct를 컴파일하고 실행하면 모든 것이 작동하는 것처럼 보입니다. 어쩌면 intellij 버전을 업데이트하거나 intellij 용 mapstruct 플러그인을 설치하려고 시도하십시오 – wsl

답변

0

IntelliJ에서만 작동하지 않는다고 가정합니다. IntelliJ가 실제로 maven 컴파일러 annotationProcessorPaths에서 주석 처리기를 선택하지 않는 알려진 문제점이 있습니다 (자세한 내용은 IDEA-150621 참조).

위의 링크 된 저장소의 예는 MapStruct 모범 사례에 대한 것입니다. springcomponentModel을 사용하면 Mappers.getMapper을 절대로 사용하지 않아야합니다. 그 이유는 공장이 스프링을 통해 건설되어야하기 때문에 매퍼를 올바르게 만들 수 없기 때문입니다. 또한 컴파일러 인수 mapstruct.defaultComponentModel은 IDE와의 통합을 중단시킬 수 있습니다 (IntelliJ 설정에서도 설정해야 함)