others - java.lang.NoSuchMethodError: org.json.JSONObject.<init>(Ljava/lang/Object;)V

我使用SpringBoot 2.1.5版本,使用spring初始化器JPA嵌入式Tomcat thymeleaf模板引擎,并将它打包为一个带有RestController的可执行JAR文件。


{


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


 }


}



public类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)



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



时间:

看起来你的类路径上有多个org.json:json依赖项。

看看它:

org.springframework.boot:spring-boot-starter-test依赖于

com.jayway.jsonpath:json-pathwhich又带来了

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路径中有一些内容依赖于旧的json库中的某些东西,还有一个带来org,json :json 。

若要验证,请运行mvn dependency:tree,并且在生成的输出中搜索org.json:json

你的destinationAddressrefundAddress作为地址或地址阵列的列表传递,而在HotelswitchHotelOrderRequestBody中,destinationAddressrefundAddress被视为单个地址元素,更新pojo或JSON并重试,可能是这个问题。

你需要使用ObjectMapper或include将POJO转换为JSONObject json依赖项


<dependency>


 <groupId>org.json</groupId>


 <artifactId>json</artifactId>


 <version>20180130</version>


</dependency>



问题应该是destinationAddress和refundAddress在JSON和POJO之间不匹配,尝试更改你的JSON :

{ "depositHotel":"xxx", "destinationHotel":"aaa", "depositHotelAmount":"0.2", "destinationHotelAmount":"4", "destinationAddress": { "address":"asdf", "tag":"" }, "refundAddress": { "address":"pio", "tag":"" } }

如果你不想更改JSON,请更改构建器POJO以便使用地址[]而不是地址对象。

你不需要JSONobject


HttpEntity<HotelswitchHotelOrderRequestBody> entity = new HttpEntity<HotelswitchHotelOrderRequestBody>(order, headers());



如果你要做的只是将对象转换为字符串,那么使用对象映射器。


ObjectMapper objectMapper = new ObjectMapper();


String json = objectMapper.writeValueAsString(car)



...