2016-09-05 1 views
0

내 엔티티 용 dto 객체를 생성하기 위해 Mapstruct를 사용하고 있습니다. 내 노트북에서 터키어로 Windows 10에서 IntelliJ를 사용하고 있습니다. 내 문제는 다음과 같습니다.IDEA의 Mapstruct에서 생성 된 소스 매퍼의 인코딩 문제

@Generated(
    value = "org.mapstruct.ap.MappingProcessor", 
    date = "2016-09-05T16:36:08+0300", 
    comments = "version: 1.0.0.Final, compiler: javac, environment: Java 1.8.0_74 (Oracle Corporation)" 
) 
public class VeininvoiceMapperImpl implements VeininvoiceMapper { 

    private final LocalDateMapper localDateMapper = Mappers.getMapper(LocalDateMapper.class); 
    private final BoxTypeMapper boxTypeMapper = Mappers.getMapper(BoxTypeMapper.class); 
    private final InvoiceStatusCodeMapper ınvoiceStatusCodeMapper = Mappers.getMapper(InvoiceStatusCodeMapper.class); 
    private final SenderLabelMapper senderLabelMapper = Mappers.getMapper(SenderLabelMapper.class); 
    private final PostboxLabelMapper postboxLabelMapper = Mappers.getMapper(PostboxLabelMapper.class); 
    private final VeinpartnerMapper veinpartnerMapper = Mappers.getMapper(VeinpartnerMapper.class); 

    @Override 
    public Invoice veininvoiceToDto(Veininvoice veininvoice) { 
     if (veininvoice == null) { 
      return null; 
     } 

     Invoice ınvoice = new Invoice(); 

     ınvoice.setInvoiceStatusCode(ınvoiceStatusCodeMapper.statusToDto(veininvoice.getInvoicestatuscode())); 
     ınvoice.setBoxType(boxTypeMapper.boxtypeToDto(veininvoice.getBoxtype())); 
     ınvoice.setPartner(veinpartnerMapper.veinpartnerToDto(veininvoice.getVeinpartner())); 
     ınvoice.setInvoiceNr(veininvoice.getInvoiceNr()); 
     ınvoice.setIsarchive(veininvoice.getIsarchive()); 
     ınvoice.setUblversionid(veininvoice.getUblversionid()); 
     ınvoice.setCustomizationid(veininvoice.getCustomizationid()); 
     ınvoice.setCopyindicator(veininvoice.getCopyindicator()); 
     ınvoice.setIssuedate(localDateMapper.issueDateToCalendar(veininvoice.getIssuedate())); 
     ınvoice.setIssuetime(veininvoice.getIssuetime()); 
     ınvoice.setServicetypecode(veininvoice.getServicetypecode()); 
     ınvoice.setNote(veininvoice.getNote()); 
     ınvoice.setCurrencycode(veininvoice.getCurrencycode()); 
     ınvoice.setLinecountnumeric(veininvoice.getLinecountnumeric()); 
     ınvoice.setIsactive(veininvoice.getIsactive()); 
     ınvoice.setSenderLabel(senderLabelMapper.senderLabeltoDto(veininvoice.getSenderLabel())); 
     ınvoice.setPostboxLabel(postboxLabelMapper.postboxLabelToDto(veininvoice.getPostboxLabel())); 
     ınvoice.setId(veininvoice.getId()); 
     ınvoice.setUuid(veininvoice.getUuid()); 

     return ınvoice; 
    } 

여러분도 알다시피, 대신에 ı로 생성 된 변수 이름은 i입니다. 그리고 모듈을 배포하거나 만들려고 시도합니다. 그것은 실패하고 클래스의 모든 ı 문자가 '?'가됩니다. 다음과 같이. .

@Generated(
    value = "org.mapstruct.ap.MappingProcessor", 
    date = "2016-09-05T16:39:20+0300", 
    comments = "version: 1.0.0.Final, compiler: javac, environment: Java 1.8.0_74 (Oracle Corporation)" 
) 
public class VeininvoiceMapperImpl implements VeininvoiceMapper { 

    private final LocalDateMapper localDateMapper = Mappers.getMapper(LocalDateMapper.class); 
    private final BoxTypeMapper boxTypeMapper = Mappers.getMapper(BoxTypeMapper.class); 
    private final InvoiceStatusCodeMapper ?nvoiceStatusCodeMapper = Mappers.getMapper(InvoiceStatusCodeMapper.class); 
    private final SenderLabelMapper senderLabelMapper = Mappers.getMapper(SenderLabelMapper.class); 
    private final PostboxLabelMapper postboxLabelMapper = Mappers.getMapper(PostboxLabelMapper.class); 
    private final VeinpartnerMapper veinpartnerMapper = Mappers.getMapper(VeinpartnerMapper.class); 

    @Override 
    public Invoice veininvoiceToDto(Veininvoice veininvoice) { 
     if (veininvoice == null) { 
      return null; 
     } 

     Invoice ?nvoice = new Invoice(); 

     ?nvoice.setInvoiceStatusCode(?nvoiceStatusCodeMapper.statusToDto(veininvoice.getInvoicestatuscode())); 
     ?nvoice.setBoxType(boxTypeMapper.boxtypeToDto(veininvoice.getBoxtype())); 
     ?nvoice.setPartner(veinpartnerMapper.veinpartnerToDto(veininvoice.getVeinpartner())); 

파일 및 전체 프로젝트의 인코딩을 UTF-8 (설정 -> 파일 인코딩)으로 설정하려고했습니다. 그러나 그것은 작동하지 않았다.

첫 번째 시나리오의 Maven은 다음과 같습니다.

... 
    <dependency> 
      <groupId>org.mapstruct</groupId> 
      <artifactId>mapstruct-jdk8</artifactId> 
      <version>${mapstruct.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.mapstruct</groupId> 
      <artifactId>mapstruct-processor</artifactId> 
      <version>${mapstruct.version}</version> 
      <scope>provided</scope> 
     </dependency> 
     ... 

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.5.1</version> 
       <configuration> 

        <source>1.8</source> <!-- or higher, depending on your project --> 
        <target>1.8</target> <!-- or higher, depending on your project --> 
        <encoding>${project.build.sourceEncoding}</encoding> 
        <annotationProcessorPaths> 
         <path> 
          <groupId>org.mapstruct</groupId> 
          <artifactId>mapstruct-processor</artifactId> 
          <version>${mapstruct.version}</version> 
         </path> 
        </annotationProcessorPaths> 
       </configuration> 
      </plugin> 

다음으로 maven 구성을 다음과 같이 변경했습니다. 그리고 나는 ı 대신에 mapper 클래스를 생성 할 수있었습니다. 하지만 make 모듈에서는 실패하고 클래스의 모든 i 문자가?로 변경되었습니다.

<plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.5.1</version> 
       <configuration> 
        <fork>true</fork> 
        <compilerArgs> 
         <arg>-J-Duser.language=en_us</arg> 
         <arg>-J-Dfile.encoding=UTF-8</arg> 
        </compilerArgs> 
        <source>1.8</source> <!-- or higher, depending on your project --> 
        <target>1.8</target> <!-- or higher, depending on your project --> 
        <encoding>${project.build.sourceEncoding}</encoding> 
        <!--<proc>none</proc> &lt;!&ndash; disable annotation processing to avoid duplicating maven-processor-plugin output &ndash;&gt;--> 
        <annotationProcessorPaths> 
         <path> 
          <groupId>org.mapstruct</groupId> 
          <artifactId>mapstruct-processor</artifactId> 
          <version>${mapstruct.version}</version> 
         </path> 
        </annotationProcessorPaths> 
       </configuration> 
      </plugin> 

더 흥미롭게도, 그것을 테스트하기 위해, 난 그냥 매퍼 종속성 및 객체와 DTO (ITestObject)와 샘플 프로젝트를 만들었습니다. 그리고 나는 그것을 동료에게 주었다. 그는 Java와 Intellij에 대해 정확히 동일한 버전을 가지고 있으며 노트북에 Windows 10 Turkish를 설치했습니다. 우리는 -J-Dfile.encoding = UTF-8을 -J-Dfile.encoding = windows-1254로 변경했습니다. 그는 빌드 성공 후 아무 문제없이 모듈을 만들었습니다. 파일이 손상되지 않았습니다. 단지 재 컴파일 모듈에서 Mapper 파일을 손상 시켰습니다. 하지만 동일한 구성으로 나는 메이븐에서 빌드 액세스를 성공적으로 마친 모듈을 만들 수 없다. 또한 MAVEN_OPTS

설정하려고 - Dfile.encoding=UTF-8 -Duser.country=TR -Duser.language=es -Duser.variant=Traditional_WIN

을하지만 불행하게도 그것은 일을 일부러. 제 생각에는 문제는 IntelliJ가있는 OS와 관련이 있습니다. IDEA 2016.2.3, Maven 3.3.9를 사용하고 있습니다. 누군가가 그 일이 일어나는 이유 또는 그것이 관련 될 수있는 이유를 알고 있습니까? 미리 감사드립니다.

답변

0

나는 원래의 Java 소스를 Latin-3로 사용했습니다.

편집기와 컴파일러는 동일한 인코딩을 사용해야합니다. 원칙적으로 UTF-8로 변경하는 것이 좋습니다. 보자.

  • 테스트 프로젝트에서 모두 사용해보십시오.
  • 외부 편집기를 사용하여 메모장 ++ 또는 JEdit과 같은 인코딩을 확인하십시오.
  • 변경 UTF-8 인코딩 (POM, 아마도 다른 장소)
  • 은 IDE에게 인코딩이 자동적으로 UTF-8로 UTF-8
  • 변환 모든 sorces 변환되지 않았다
  • 확인을 둡니다.
  • IDE 시작
  • 깨끗한 상태로 만듭니다.

그리고 아마도 작동하지 않았을 것입니다. 받는다는에 대한 -Dfile.encoding=UTF-8 오른쪽 속성입니다 만, 비

<encoding>${project.build.sourceEncoding}</encoding> 

가 결정적인 필요합니다. project.build.sourceEncoding=UTF-8을 확인하십시오.

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
</properties> 
+0

신속하게 답변 해 주셔서 감사합니다. 그러나 그것은 작동하지 않았다. 이미 메모장에서 확인했습니다. ++. 클래스에는 UTF-8 인코딩이 있습니다. 그리고 나는 sourceEncoding과 outputEncoding을 이미 속성 태그에서 UTF-8로 설정하고 인코딩에 사용했습니다. 하지만 어떻게 든 mapper 클래스의 i 문자가 생성됩니다? 클래스를 만들거나 모듈을 만든 후에. 나는 이것을 해결하기 위해 6 시간 이상 고투하고있다. 그러나 아무 결과도 ... – Runomu

+0

편집자의 특혜는 역시 좋다? mapstruct 프로세서 여야합니다. http://mapstruct.org/news/page/3.html 인코딩을 찾으십시오 –

+0

예 저는 꽤 확신합니다. UTF-8을 여러 번 확인했습니다. 링크 주셔서 감사합니다. 나는 gradle에 대해 주어진 컴파일러 args를 시도했다. 그러나 다시는 결과가 없습니다. 내가 오늘이 문제를 해결할 수 없다면, 나는 dto의 이름을 바꾸고 이것처럼 계속할 것이라고 생각한다. :) – Runomu