2015-08-10 11 views
8

Ho classi successive:MapStruct richiede IMPL classe

Mapper

public interface DeviceTokensMapper { 

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

    @Mappings({ 
      @Mapping(source = "tokenName", target = "tokenName"), 
      @Mapping(source = "userOsType", target = "osType"), 
    }) 

    DeviceTokensDTO toDeviceTokensDTO(DeviceTokens deviceTokens); 
} 

Entity:

@Entity 
public class DeviceTokens { 

    @Id 
    @Column(name="token_name", nullable = false) 
    private String tokenName; 

    @Column(name = "os", nullable = false) 
    @Enumerated 
    private UserOSType userOsType; 

    public DeviceTokens() {} 

    public DeviceTokens(String tokenName, UserOSType userOSType) { 
     this.tokenName = tokenName; 
     this.userOsType = userOSType; 
    } 

    public String getTokenName() { 
     return tokenName; 
    } 

    public void setTokenName(String tokenName) { 
     this.tokenName = tokenName; 
    } 

    public UserOSType getUserOsType() { 
     return userOsType; 
    } 

    public void setUserOsType(UserOSType userOsType) { 
     this.userOsType = userOsType; 
    } 
} 

DTO:

public class DeviceTokensDTO { 

    private String tokenName; 

    private UserOSType osType; 

    public DeviceTokensDTO() {} 

    public DeviceTokensDTO(String tokenName, UserOSType osType) { 
     this.tokenName = tokenName; 
     this.osType = osType; 
    } 

    public UserOSType getOsType() { 
     return osType; 
    } 

    public void setOsType(UserOSType osType) { 
     this.osType = osType; 
    } 

    public String getTokenName() { 
     return tokenName; 
    } 

    public void setTokenName(String tokenName) { 
     this.tokenName = tokenName; 
    } 
} 

e il metodo da primavera servizio classe dove io uso questa mappatura:

Quando eseguo metodo di cui sopra vedo eccezione successiva:

ERRORE [DispatcherServlet] :? - Servlet.service() per servlet [dispatcherServlet] nel contesto con percorso [] ha gettato l'eccezione [Elaborazione handler non riuscita; l'eccezione annidata è java.lang.ExceptionInInitializerError] con causa principale java.lang.ClassNotFoundException: dto.DeviceTokensMapperImpl

Allora perché mapper richiedono classe di implementazione? Potresti per favore qualcuno consigliare? Grazie.

+1

Come hai fatto a risolverlo? –

risposta

8

MapStruct genera codice in fase di compilazione e la chiamata a Mappers.getMapper(DeviceTokensMapper.class); cercherà l'implementazione generata dell'interfaccia del programma di mapping. Per qualche motivo sembra che manchi nella tua unità di schieramento (WAR, ecc.).

Btw. quando si lavora con Spring come contenitore DI, è possibile utilizzare @Mapper(componentModel="spring") e sarà possibile ottenere istanze di mapping tramite Injection dipendenza anziché utilizzare lo stabilimento Mappers.

+1

Ho aggiunto sia il modello del componente che il processore della mappa struct ma sto ancora trovando Impossibile trovare l'implementazione per ABCMapper che è l'interfaccia Mappper – Ramkumar

+0

Hai trovato una soluzione? –

+0

'target/generated-sources' è vuoto: [ – aliopi

7

Avete entrambi mapstruct-processor-xx e mapstruct-xx librerie inclusi nel vostro progetto?

Ho avuto lo stesso problema e mi sono reso conto di aver dimenticato di includere mapstruct-processor-xx.

2

Stai usando Maven? Se sì, allora molto probabilmente hai perso la configurazione di mapstruct-processor sotto il plugin del compilatore maven.

La configurazione corretta è la seguente:

<dependencies> 
    <dependency> 
     <groupId>org.mapstruct</groupId> 
     <artifactId>mapstruct</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher --> 
     <version>${org.mapstruct.version}</version> 
    </dependency> 
</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.5.1</version> 
      <configuration> 
       <source>1.6</source> <!-- or higher, depending on your project --> 
       <target>1.6</target> <!-- or higher, depending on your project --> 
       <annotationProcessorPaths> 
        <path> 
         <groupId>org.mapstruct</groupId> 
         <artifactId>mapstruct-processor</artifactId> 
         <version>${org.mapstruct.version}</version> 
        </path> 
       </annotationProcessorPaths> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
1

Nel mio caso avevo avvolto <plugin> all'interno <pluginManagement> tag per aggirare un bug di Eclipse (Mars) come segue

<pluginManagement> 
<plugin> ... </plugin> 
</pluginManagement> 

Rimozione <pluginManagement> tag è stato risolto per me.

0

Mi sono imbattuto in questo problema perché non ho eseguito ./gradlew clean build (gradlew.bat per Windows) dopo aver creato/modificato la classe mapper o le classi correlate.

Inoltre, qualcosa che ho trovato è stato utile è ./gradlew clean build -x test funziona, ma non esegue tutto il test, che è stato molto nel mio caso.

1

Ho incontrato lo stesso problema nel mio progetto con gradle. E si sostituisce la build.gradel da

compile 'org.mapstruct:mapstruct:1.2.0.CR2' 

a

compile 'org.mapstruct:mapstruct-jdk8:1.1.0.Final' 
compile 'org.mapstruct:mapstruct-processor:1.1.0.Final' 

Poi sh generazione pulita & build. Ora funziona!

1

se si utilizza Maven, è necessario aggiungere mapstruct processore dipendenza come segue:

<dependency> 
    <groupId>org.mapstruct</groupId> 
    <artifactId>mapstruct-jdk8</artifactId> 
    <version>1.2.0.Final</version> 
</dependency> 
<dependency> 
    <groupId>org.mapstruct</groupId> 
    <artifactId>mapstruct-processor</artifactId> 
    <version>1.2.0.Final</version> 
</dependency> 
+0

Ha fatto il lavoro per me. Grazie. – Jaumzera