내 엔티티 용 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> <!– disable annotation processing to avoid duplicating maven-processor-plugin output –>-->
<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를 사용하고 있습니다. 누군가가 그 일이 일어나는 이유 또는 그것이 관련 될 수있는 이유를 알고 있습니까? 미리 감사드립니다.
신속하게 답변 해 주셔서 감사합니다. 그러나 그것은 작동하지 않았다. 이미 메모장에서 확인했습니다. ++. 클래스에는 UTF-8 인코딩이 있습니다. 그리고 나는 sourceEncoding과 outputEncoding을 이미 속성 태그에서 UTF-8로 설정하고 인코딩에 사용했습니다. 하지만 어떻게 든 mapper 클래스의 i 문자가 생성됩니다? 클래스를 만들거나 모듈을 만든 후에. 나는 이것을 해결하기 위해 6 시간 이상 고투하고있다. 그러나 아무 결과도 ... – Runomu
편집자의 특혜는 역시 좋다? mapstruct 프로세서 여야합니다. http://mapstruct.org/news/page/3.html 인코딩을 찾으십시오 –
예 저는 꽤 확신합니다. UTF-8을 여러 번 확인했습니다. 링크 주셔서 감사합니다. 나는 gradle에 대해 주어진 컴파일러 args를 시도했다. 그러나 다시는 결과가 없습니다. 내가 오늘이 문제를 해결할 수 없다면, 나는 dto의 이름을 바꾸고 이것처럼 계속할 것이라고 생각한다. :) – Runomu