Ломбок и Джексон не работают вместе с openjdk12
Воспроизводится здесь:
Раньше у меня была Java 8.x все работало нормально. как открыть JDK, так и Oracle.
После обновления JDK & и Oracle JDK я получил исключения из jackson
,
Error:(10, 1) java: constructor ClientResponseData in class my.response.ClientResponseData cannot be applied to given types;
required: no arguments
found: java.lang.String,java.lang.String
reason: actual and formal argument lists differ in length
Мой ClientResponseData определен следующим образом:
@JacksonXmlRootElement(localName = "ClientResponseData")
@Builder
@Getter
public class ClientResponseData {
@JacksonXmlProperty(localName = "responseCode")
private String responseCode;
@JacksonXmlProperty(localName = "number")
private String number;
}
Зависимость, которая работала для меня до обновления Java:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
в pom.xml я все еще использую: <java.version>1.8</java.version>
После обновления Java я должен был обновить Lombok по крайней мере до последней версии: 1.18.8
Тогда у меня начинаются проблемы.
Error:(10, 1) java: constructor ClientResponseData in class my.response.ClientResponseData cannot be applied to given types;
required: no arguments
found: java.lang.String,java.lang.String
reason: actual and formal argument lists differ in length
Это терпит неудачу на:
return new com.fasterxml.jackson.dataformat.xml.XmlMapper().readValue(xmlString, cls);
Любая подсказка, как заставить это работать?
Я старался:
добавить @NoArgsConstructor - Нет
обновить Джексон до последней - Нет
1 ответ
Я обнаружил, что комбинация @AllArgsConstructor и общедоступной ClientResponseData() {} делает хитрость, и она начинает работать.
(Мне не нужно это с java 8, но для java11, 12 это единственный способ, которым я мог заставить его работать)
@JacksonXmlRootElement(localName = "ClientResponseData")
@Builder
@Getter
@AllArgsConstructor
@ToString
public class ClientResponseData {
public ClientResponseData() {}
@JacksonXmlProperty(localName = "responseCode")
private String responseCode;
@JacksonXmlProperty(localName = "number")
private String number;
}
Если есть лучшее решение, пожалуйста, дайте мне знать!
Также:
@AllArgsConstructor + @NoArgsConstructor
делает трюк тоже.