programing

MapStruct 구현이 Spring Boot Web Application에서 작동하지 않습니다.

lastmoon 2023. 7. 21. 21:50
반응형

MapStruct 구현이 Spring Boot Web Application에서 작동하지 않습니다.

저는 Spring Boot and MapStruct Tool 초보자입니다.

이전에 A 프로젝트(이 기술을 사용하여 다른 팀에서 작성)가 시작되지 않았습니다.그리고 나서, 나는 매퍼 추상 클래스에서 약간의 변경을 했지만, 지금 매퍼 객체는 애플리케이션 시작 시 null로 오고 있습니다.

매퍼 추상 클래스:

@Mapper(componentModel = "spring")
public abstract class UserAndEmployeeMapper {

    public UserAndEmployeeMapper INSTANCE = Mappers.getMapper( UserAndEmployeeMapper.class );

    @Mapping(source = "username", target = "name")
    @Mapping(source = "ssn", target = "ssn", defaultValue = "xxxxxx" )
    @Mapping(target = "salary", constant = "34.67")
    @Mapping(target = "dob", dateFormat = "dd/MM/yyyy", constant = "10/12/2002")
    public abstract Employee mapToEmployee(User user);

    public abstract List<Employee> mapToEmployee(List<User> users);

    @Mapping(source = "name", target = "username")
    public abstract User mapToUser(Employee employee);

    public abstract List<User> mapToUser(List<Employee> employees);

}

LoginServiceImppl 클래스

@Service("loginService")
public class LoginServiceImpl implements LoginService{

    private static final AtomicLong counter = new AtomicLong();

    @Autowired
    private EmployeeDao employeeDao;

    private UserAndEmployeeMapper userAndEmployeeMapper;
...

}

pom.xml

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.plugin.version}</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${mapstruct.jdk8.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
</build>

LoginServiceImppl에서 @Autowired를 추가한 후 애플리케이션이 시작되지 않고 다음 오류 로그가 표시됨

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

Description:

Field userAndEmployeeMapper in org.service.impl.LoginServiceImpl required a bean of type 'org.mapper.UserAndEmployeeMapper' that could not be found.


Action:

Consider defining a bean of type 'org.mapper.UserAndEmployeeMapper' in your configuration.

좋은 의견이라도 있나?

pom.xml에서 이것을 시도합니다.

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>17</source>
                <target>17</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.4.2.Final</version>
                    </path>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.22</version>
                    </path>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok-mapstruct-binding</artifactId>
                        <version>0.2.0</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>

메이븐(ALT+F5)을 다시 로드합니다.

일단은.public UserAndEmployeeMapper INSTANCE = Mappers.getMapper( UserAndEmployeeMapper.class );기본 구성 요소 모델과 함께만 사용해야 합니다. 그렇지 않으면 다음과 같은 위험이 있습니다.UserAndEmployeeMapper올바르게 초기화되지 않았습니다.

UserAndEmployeeMapper당신의LoginServiceImpl주석을 달아야 합니다.@Autowired그렇지 않으면 스프링에 의해 주입될 수 없으며, 그것이 그것이 이유입니다.null.

저는 당신의 패키지 구조를 모릅니다.패키지의 Spring Boot 응용 프로그램 클래스org그러면 그것은 그것을 집어들 것입니다.UserAndEmployeeMapperImpl그렇지 않으면 스프링 구성이 다음을 선택해야 합니다.UserAndEmployeeMapperImpl.

위의 모든 것이 올바르게 설정되어 있고 IDE를 통해 응용 프로그램을 시작하는 경우 다음을 확인합니다.target/generated-sources아니면 Gradle에 대한 대안은 당신의 소스의 일부이고 선택됩니다.IDE 지원에서 IDE에 대한 주석 프로세서 검색을 올바르게 설정했는지 확인합니다.예를 들어 IntelliJ는 현재 설정으로 MapStruct 주석 처리기를 호출하지 않고 다음을 선택하지 않습니다.annotationProcessorPaths메이븐 컴파일러에서.

추상적인 수업을 인터페이스로 만드는 것이 저에게 효과가 있었습니다.

public interface UserAndEmployeeMapper {

springfox-swagger2 종속성은 이전 버전의 mapstruct를 제외하고 pom.xml에 특정 버전의 mapstruct 종속성을 추가한 후 로드하는 것입니다. 소스 생성을 시작했습니다.

<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.2.2</version>
<exclusions>
 <exclusion>
 <groupId>org.mapstruct</groupId>
  <artifactId>mapstruct</artifactId>
 </exclusion>
</exclusions>

아래에 지도 구조 종속성이 추가되었습니다.

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.0.Beta1</version>

모든 매퍼 클래스를 스프링빈 자격으로 만들려면 maven-compiler-plugin에 다음 컴파일러Args를 추가합니다.

<compilerArgs>
<arg>-Amapstruct.suppressGeneratorTimestamp=true</arg>
<arg>-Amapstruct.defaultComponentModel=spring</arg>
</compilerArgs> 

maven-discovery-discovery를 사용하는 경우 다음 옵션을 추가합니다.

<options>                       
<mapstruct.suppressGeneratorTimestamp>
true
</mapstruct.suppressGeneratorTimestamp>                      
<mapstruct.defaultComponentModel>
spring
</mapstruct.defaultComponentModel>
</options>

먼저 아래와 같이 인터페이스를 만들어야 합니다.

@Mapper(componentModel = "spring")
public interface CompanyMapper {
     @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
     void updateCustomerFromDto(CompanyDto dto, @MappingTarget CompanyBean entity);
}

이제 애플리케이션을 실행하면 대상/생성된 소스 폴더에 구현 파일이 자체적으로 생성됩니다.

를 사용하고 보다 회사맵퍼를 사용할 때는 를 사용하기 .@Mapper(componentModel = "spring")그래서 스프링 부츠는 이것을 주입할 수 있습니다.

또한 이클립스의 다음 단계를 수행하여 메이븐 주석 처리를 활성화해야 합니다.

1단계: - 프로젝트에서 마우스 오른쪽 버튼을 클릭
: - to - : - 로 이동합니다.
: 확장하기: 메이븐 확장하기
: - 처리 선택 : - 주석 처리
5단계 : - 프로젝트별 설정 활성화 선택
: - Radio( 라디오) 버튼 6번 선택 : - Experimental Radio(실험 라디오) 선택
: - and (적용 후 닫기) : - 적용합니다.

됐습니다! 누군가에게 도움이 되었으면 좋겠습니다.

저의 경우, 오류는 불완전한 build.gradle 때문이라고 생각합니다.

전에

dependencies {
    compile group: 'org.mapstruct', name: 'mapstruct-processor', version: '1.2.0.Final'
}

끝나고

apply plugin: 'net.ltgt.apt'

dependencies {
    compile group: 'org.mapstruct', name: 'mapstruct-processor', version: '1.2.0.Final'
    compile group: 'org.mapstruct', name: 'mapstruct-jdk8', version: '1.2.0.Final'
    apt 'org.mapstruct:mapstruct-processor:1.2.0.Final'
}


buildscript {
    repositories {
        mavenCentral()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath("net.ltgt.gradle:gradle-apt-plugin:0.9")
    }
}

설명서에 설명된 대로 build.gradle을 올바르게 구성했는지 확인합니다.

Eclipse를 사용하는 경우 m2e-apt 플러그인을 설치해야 할 수 있습니다.

IDE의 MapStruct에 대한 주석 처리기를 활성화합니다.

주석 프로세서 경로를 종속성에 넣었는지 확인합니다.

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>${java.version}</source> <!-- depending on your project -->
                <target>${java.version}</target> <!-- depending on your project -->
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>${org.mapstruct.version}</version>
                    </path>
                    <!-- other annotation processors -->
                </annotationProcessorPaths>
            </configuration>
        </plugin>

POM.XML

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.customer-service</groupId>
    <artifactId>customer-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>customer-service</name>
    <description>Microservice Client-Facture avec Spring Boot</description>
    <properties>
        <java.version>11</java.version>
        <spring-cloud.version>2021.0.3</spring-cloud.version>
         <org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->

        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>1.5.2</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

     <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.16</version>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
             
                <configuration>
                    <source>17</source> <!-- depending on your project -->
                    <target>17</target> <!-- depending on your project -->
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.16</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                        <!-- other annotation processors -->
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

언급URL : https://stackoverflow.com/questions/44458089/mapstruct-implementation-is-not-working-in-spring-boot-web-application

반응형