У меня есть базовое приложение SpringBoot 2.1.5.RELEASE. Использование Spring Initializer, JPA, встроенного Tomcat, механизма шаблонов Thymeleaf и пакета в виде исполняемого файла JAR с некоторыми RestControllers.
В 1 контроллере это тело, которое я отправляю:
{
"depositHotel": "xxx",
"destinationHotel": "aaa",
"depositHotelAmount": "0.2",
"destinationHotelAmount": "4",
"destinationAddress": [{
"address": "asdf",
"tag": ""
}],
"refundAddress": [{
"address": "pio",
"tag": ""
}]
}
поэтому я создаю этот класс, чтобы отправить его как RequestBody:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"address",
"tag"
})
public class Address {
public Address() {
super();
}
public Address(String address) {
super();
this.address = address;
}
@JsonProperty("address")
private String address;
@JsonProperty("tag")
private Object tag;
@JsonProperty("address")
public String getAddress() {
return address;
}
@JsonProperty("address")
public void setAddress(String address) {
this.address = address;
}
@JsonProperty("tag")
public Object getTag() {
return tag;
}
@JsonProperty("tag")
public void setTag(Object tag) {
this.tag = tag;
}
}
а также
открытый класс HotelswitchHotelOrderRequestBody {
public static class Builder {
private String depositHotel;
private String destinationHotel;
private Float depositHotelAmount;
private Float destinationHotelAmount;
private Address destinationAddress;
private Address refundAddress;
public Builder(String depositHotel, String destinationHotel) {
this.depositHotel = depositHotel;
this.destinationHotel = destinationHotel;
}
public Builder withDepositHotelAmount (Float depositHotelAmount) {
this.depositHotelAmount = depositHotelAmount;
return this;
}
public Builder withDestinationHotelAmount (Float destinationHotelAmount) {
this.destinationHotelAmount = destinationHotelAmount;
return this;
}
public Builder toDestinationAddress (Address destinationAddress) {
this.destinationAddress = destinationAddress;
return this;
}
public Builder toRefundAddress (Address refundAddress) {
this.refundAddress = refundAddress;
return this;
}
public HotelswitchHotelOrderRequestBody build(){
HotelswitchHotelOrderRequestBody order = new HotelswitchHotelOrderRequestBody();
order.depositHotel = this.depositHotel;
order.depositHotelAmount = this.depositHotelAmount;
order.destinationAddress = this.destinationAddress;
order.destinationHotel = this.destinationHotel;
order.destinationHotelAmount = this.destinationHotelAmount;
order.refundAddress = this.refundAddress;
return order;
}
}
private String depositHotel;
private String destinationHotel;
private Float depositHotelAmount;
private Float destinationHotelAmount;
private Address destinationAddress;
private Address refundAddress;
private HotelswitchHotelOrderRequestBody () {
//Constructor is now private.
}
public String getDepositHotel() {
return depositHotel;
}
public void setDepositHotel(String depositHotel) {
this.depositHotel = depositHotel;
}
public String getDestinationHotel() {
return destinationHotel;
}
public void setDestinationHotel(String destinationHotel) {
this.destinationHotel = destinationHotel;
}
public Float getDepositHotelAmount() {
return depositHotelAmount;
}
public void setDepositHotelAmount(Float depositHotelAmount) {
this.depositHotelAmount = depositHotelAmount;
}
public Float getDestinationHotelAmount() {
return destinationHotelAmount;
}
public void setDestinationHotelAmount(Float destinationHotelAmount) {
this.destinationHotelAmount = destinationHotelAmount;
}
public Address getDestinationAddress() {
return destinationAddress;
}
public void setDestinationAddress(Address destinationAddress) {
this.destinationAddress = destinationAddress;
}
public Address getRefundAddress() {
return refundAddress;
}
public void setRefundAddress(Address refundAddress) {
this.refundAddress = refundAddress;
}
}
а также
public test postOrder ( HotelswitchHotelOrderRequestBody order) {
HttpEntity<String> entity = new HttpEntity<String>(new JSONObject(order).toString(), headers());
ResponseEntity<OrderResponse> response = new RestTemplate()
.exchange(URL,
HttpMethod.POST, entity, new ParameterizedTypeReference<OrderResponse>() {});
return response.getBody();
}
Но у меня есть эта ошибка:
java.lang.NoSuchMethodError: org.json.JSONObject.<init>(Ljava/lang/Object;)V
at io.bonanza.backend.service.Hotelswitch.HotelswitchHotelService.postOrder(HotelswitchHotelService.java:132)
at io.bonanza.backend.service.Hotelswitch.HotelswitchHotelServiceTests.testPostOrder(HotelswitchHotelServiceTests.java:151)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
пом.xml:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.googlecode.libphonenumber</groupId>
<artifactId>libphonenumber</artifactId>
<version>8.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- Spring Security -->
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-test -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<!-- <version>4.5.4</version> -->
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1.1</version>
</dependency>
<!-- Firebase dependencies -->
<dependency>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-admin</artifactId>
<version>5.4.0</version>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-firestore</artifactId>
<version>0.26.0-beta</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
</dependencies>
Иногда возникают проблемы с зависимостями в файле pom.xml (Maven). Причин тому может быть много: конфликт версий или конфликт при объявлении одной и той же зависимости дважды с разными версиями.
Не могли бы вы опубликовать результат зависимости mvn:tree?
Какую версию Java вы используете для запуска?




Ваши destinationAddress и refundAddress передаются в виде списка адресов или массива адресов в JSON, а в HotelswitchHotelOrderRequestBody ваши destinationAddress и refundAddress упоминаются как один элемент адреса. Обновите pojo или JSON и повторите попытку. Это может быть проблемой.
Вам нужно преобразовать POJO в JSONObject с помощью ObjectMapper или включить json-зависимость
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20180130</version> </dependency>
Похоже, у вас есть более одной зависимости org.json:json от вашего пути к классам.
Глядя на это:
org.springframework.boot:spring-boot-starter-test зависит от
com.jayway.jsonpath:json-path что, в свою очередь, приносит
org.json:json которая может быть новее/старее версии, на которой
io.jsonwebtoken jjwt 0.9.1 зависит от
Вы можете попробовать исключить эту транзитивную зависимость из spring-boot-starter-test/io.jsonwebtoken:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
</exclusion>
</exclusions>
</dependency>
ИЛИ/И
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
<exclusions>
<exclusion>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
</exclusion>
</exclusions>
</dependency>
Но возможно, что в json-path есть что-то, что зависит от чего-то из старой библиотеки json, которой больше нет в более новой версии, поэтому действуйте с осторожностью и тщательно все тестируйте. Также есть вероятность, что что-то еще принесет org.json:json.
Для проверки запустите mvn dependency:tree и найдите в полученном выводе org.json:json.
Пожалуйста, прокомментируйте, если после ответа возникли какие-либо проблемы или если это не сработало. Если это решило проблему, принятие ответа будет оценено.
Проблема должна заключаться в несоответствии адреса назначения и адреса возврата между вашим JSON и POJO. Попробуйте изменить свой JSON следующим образом:
{
"depositHotel": "xxx",
"destinationHotel": "aaa",
"depositHotelAmount": "0.2",
"destinationHotelAmount": "4",
"destinationAddress": {
"address": "asdf",
"tag": ""
},
"refundAddress": {
"address": "pio",
"tag": ""
}
}
Если вы не хотите менять свой JSON, измените свой POJO Builder, чтобы использовать Address [] вместо объекта Address.
Вам не нужен JSONobject
HttpEntity<HotelswitchHotelOrderRequestBody> entity = new HttpEntity<HotelswitchHotelOrderRequestBody>(order, headers());
если все, что вы хотите сделать, это преобразовать ваш объект в строку, используйте средство сопоставления объектов.
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(car)
Я нашел это на другой странице. Я попробовал проверенный ответ здесь, и он не сработал с моим, но когда я вставил его в свой файл pom, он сработал. Я запускаю модульные тесты с mockito, и одна из конечных точек использует JSONObject.put и выдает мне ошибку «Нет такого метода».
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
</exclusion>
<exclusion>
<groupId>com.vaadin.external.google</groupId>
<artifactId>android-json</artifactId>
</exclusion>
</exclusions>
</dependency>
Это сработало для меня, НО также мне пришлось обновить мои зависимости Maven после изменения. Спасибо.
Также работал на меня. Добавления только исключения org.json было недостаточно. (весенняя загрузка 2.4.4 и Junit 5)
Пожалуйста, проверьте эту ссылку: проблема с весенней загрузкой 8706
У меня сработало исключение android-json из spring-boot-starter-test.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>com.vaadin.external.google</groupId>
<artifactId>android-json</artifactId>
</exclusion>
</exclusions>
</dependency>
Добавьте свой POM, пожалуйста. Обычно это происходит из-за того, что Spring не позволяет управлять зависимостями.