2016-09-05 7 views
0

Я использую Mapstruct для генерации объектов dto для моих объектов. Я использую IntelliJ на окнах 10 на турецком языке на своем ноутбуке. Моя проблема была следующей.Проблема с кодировкой для сгенерированного преобразователя исходного кода в Mapstruct на IDEA

@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 следующим образом. И мне удалось создать классы сопоставления с i вместо ı. Но на модуле make он терпит неудачу, и все персонажи в классе изменились на?. более

<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> 

интересно, для того, чтобы проверить это, я создал пример проекта только с зависимостями Mapper и объектом и DTO (ITestObject). И я дал его своему коллеге. Он имеет точно такую ​​же версию для Java и Intellij, а также установил Windows 10 Turkish на своем ноутбуке. Мы изменили -J-Dfile.encoding = UTF-8 на -J-Dfile.encoding = windows-1254. он создал модуль без проблем после Build Success. Файл не поврежден. на всякий случай перекомпилировать модуль, он также испортил файл Mapper как я. Но с такой же конфигурацией я могу сделать модуль успешным после выхода на сбор в maven. Я также попытался установить MAVEN_OPTS

- Dfile.encoding=UTF-8 -Duser.country=TR -Duser.language=es -Duser.variant=Traditional_WIN

Но, к сожалению, он не работал. Я думаю, проблема как-то связана с ОС с IntelliJ. Я использую IDEA 2016.2.3, Maven 3.3.9. Есть ли у кого-то идея, почему это происходит или к чему это может быть связано? Заранее спасибо.

ответ

0

Я использую оригинальные источники java на Latin-3.

Редактор и компилятор должны использовать ту же кодировку. Переключение на UTF-8 целесообразно, поэтому давайте посмотрим.

  • Попробуйте все в тестовом проекте.
  • Имейте внешний редактор, чтобы проверить кодировку как Notepad ++ или JEdit.
  • Изменить кодировку UTF-8 (POM, возможно, в других местах)
  • Оставьте IDE
  • Убедитесь, что кодирование не получают автоматически преобразуются в UTF-8
  • Преобразовать все sorces в UTF-8.
  • Запустите 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

Благодарим за быстрый ответ. Но это не сработало. Я уже проверил его на Notepad ++. Класс имеет кодировку UTF-8. И я добавил уже sourceEncoding и outputEncoding, установленный в UTF-8 в теге свойств и использующий их для кодирования. Но каким-то образом сгенерированные символы i в классах карт изменились? После создания класса или создания модуля. Я решаю больше 6 часов, чтобы решить эту проблему. Но никакого результата ... – Runomu

+0

Предпочтения редактора тоже в порядке? Это должен быть процессор mapstruct. См. Http://mapstruct.org/news/page/3.html искать кодировку –

+0

Да, я уверен. Я проверил его несколько раз для UTF-8. Спасибо за ссылку. Я пробовал компиляторы, заданные для gradle. Но результата нет. если я не могу решить эту проблему сегодня, я думаю, что буду переименовывать dto и продолжать так. :) – Runomu