问题描述
如果我尝试从Spring Boot REST Controller的处理程序方法返回FlightOfferSearch []或FlightOrder对象,则它们似乎无法像杰克逊处理JSON序列化之前使用的更简单的POJO一样正确地序列化。 / p>
我的代码(实际的API调用与):
import com.amadeus.Amadeus;
import com.amadeus.Params;
import com.amadeus.exceptions.ResponseException;
import com.amadeus.resources.FlightOfferSearch;
import com.amadeus.resources.FlightOrder;
import com.amadeus.resources.Traveler;
import io.github.cdimascio.dotenv.Dotenv;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Objects;
@RequestMapping( api / v1)
@RestController
公共类TestController {
私有静态Amadeus getFreshAccessToken(){
Dotenv dotenv = Dotenv.load();
return Amadeus
.builder(Objects.requireNonNull(dotenv.get( AMADEUS_KEY)),Objects.requireNonNull(dotenv.get( AMADEUS_SECRET)))
.build();
}
@GetMapping( / test)
FlightOrder testHandler()抛出ResponseException {
Amadeus amadeus = getFreshAccessToken();
Traveler旅行者= new Traveler();
traveler.setId( 1);
traveler.setDateOfBirth( 2000-04-14);
traveler.setName(traveler.new Name( JORGE, GONZALES));
Traveler.Phone [] phone =新的Traveler.Phone [1];
phone [0] = traveler.new Phone();
phone [0] .setCountryCallingCode( 33);
phone [0] .setNumber( 675426222);
phone [0] .setDeviceType( MOBILE);
Traveler.Contact contact = traveler.new Contact();
contact.setPhones(phone);
traveler.setContact(contact);
Traveler.Document [] document = new Traveler.Document [1];
document [0] = traveler.new Document();
document [0] .setDocumentType( PASSPORT);
document [0] .setNumber( 480080076);
document [0] .setExpiryDate( 2022-10-11);
document [0] .setIssuanceCountry( ES);
document [0] .setNationality( ES);
document [0] .setHolder(true);
traveler.setDocuments(document);
Traveler [] travelerArray = new Traveler [1];
travelerArray [0] =旅行者;
System.out.println(travelerArray [0]);
FlightOfferSearch [] flightOffersSearches = amadeus.shopping.flightOffersSearch.get(
Params.with( originLocationCode, SYD)
.and( destinationLocationCode, BKK )
.and( departureDate, 2020-11-01)
.and( returnDate, 2020-11-08)
.and( adults ,1)
.and( max,1));
FlightOrder订单= amadeus.booking.flightOrders.post(flightOffersSearches,travelerArray);
退货单;
}
}
邮递员要求返回:
状态:500,
错误:内部服务器错误,
消息: JSON映射问题:com.amadeus.resources.FlightOrder [\ response\]-> com.amadeus.Response [\ result\]-> com.google.gson.JsonObject [\ asBoolean\];嵌套的异常是com.fasterxml.jackson.databind.JsonMappingException:JsonObject(通过参考链:com.amadeus.resources.FlightOrder [\ response\]-> com.amadeus.Response [\ result\]-> com.google.gson.JsonObject [\ asBoolean\]),
和服务器日志
错误45864 --- [nio-8080-exec- 1] oaccC [。[。[/]。[dispatcherServlet]:路径为[]的上下文中Servlet [dispatcherServlet]的Servlet.service()抛出异常[请求处理失败;嵌套的异常是org.springframework.http.converter.HttpMessageConversionException:JSON映射问题:com.amadeus.resources.FlightOrder [ response]-> com.amadeus.Response [ result]-> com.google.gson .JsonObject [ asBoolean];嵌套的异常是com.fasterxml.jackson.databind.JsonMappingException:JsonObject(通过参考链:com.amadeus.resources.FlightOrder [ response]-> com.amadeus.Response [ result]-> com.google .gson.JsonObject [ asBoolean])],其根本原因为
java.lang.UnsupportedOperationException:com.google.gson.JsonElement.getAsBoolean(JsonElement.java:153)上的JsonObject
〜[gson-2.8.5.jar:na]
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)〜[na:1.8.0_232]
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl .java:62)〜[na:1.8.0_232]
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)〜[na:1.8.0_232]
在java.lang.reflect .Method.invoke(Method.java:498)〜[na:1.8.0_232]
在com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:688)〜[jackson-databind- 2.10.2.jar:2.10.2] com.fasterxml.jackson.databind.ser.std.Be中的
anSerializerBase.serializeFields(BeanSerializerBase.java:722)〜[jackson-databind-2.10.2.jar:2.10.2]
在com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166 )〜[jackson-databind-2.10.2.jar:2.10.2]
在com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727)〜[jackson-databind-2.10。 2.jar:2.10.2] com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722)中的
〜[jackson-databind-2.10.2.jar:2.10.2 ]
在com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166)〜[jackson-databind-2.10.2.jar:2.10.2]
在com.fasterxml .jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727)〜[jackson-databind-2.10.2.jar:2.10.2]
,位于com.fasterxml.jackson.databind.ser.std。 BeanSerializerBase.serializeFields(BeanSerializerBase.java:722)〜[jackson-databind-2.10.2.jar:2.10.2]
在com.fasterxm l.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166)〜[jackson-databind-2.10.2.jar:2.10.2]
,位于com.fasterxml.jackson.databind.ser.DefaultSerializerProvider ._serialize(DefaultSerializerProvider.java:480)〜[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) 〜[jackson-databind-2.10.2.jar:2.10.2]
在com.fasterxml.jackson.databind.ObjectWriter $ Prefetch.serialize(ObjectWriter.java:1433)〜[jackson-databind-2.10.2 .jar:2.10.2] com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:921)中的
〜[jackson-databind-2.10.2.jar:2.10.2]
在org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:294)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
在org.springframework。 http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttp MessageConverter.java:104)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
在org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor .java:287)〜[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
在org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor。 java:181)〜[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82)〜 [spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE] org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:124)中的
〜[ spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
,位于org.springframework.web.servlet.mvc.method.annotation.RequestMa ppingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)〜[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter .handleInternal(RequestMappingHandlerAdapter.java:793)〜[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
在org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle( AbstractHandlerMethodAdapter.java:87)〜[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]位于org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)的
〜 [spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)〜[spring-webmvc-5.2。 4.RELEASE.jar:5.2.4.RELEASE]
,位于org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)〜[spring-webmvc-5.2.4.RELEASE.jar:5.2 .4.RELEASE]
在org.springframework.web.servlet .FrameworkServlet.doPost(FrameworkServlet.java:909)〜[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
在javax.servlet.http.HttpServlet.service(HttpServlet.java: 660)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)〜[spring-webmvc-5.2 .4.RELEASE.jar:5.2.4.RELEASE]
在javax.servlet.http.HttpServlet.service(HttpServlet.java:741)〜[tomcat-embed-core-9.0.31.jar:9.0。 31] org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)中的
〜[tomcat-embed-core-9.0.31.jar:9.0.31] org中的
。 apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
在org.apache.tomcat.websocket.server.WsFilter .doFilter(WsFilter.java:53)〜[tomcat-embed-websocket-9.0.31.jar:9.0.31]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 〜[t omcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.31 .jar:9.0.31] org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)中的
〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE] org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]中的
。 apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)〜[ spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
,位于org.springframework.web.filter.OncePerRequestFilter.doFilter(O ncePerRequestFilter.java:119)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜 [tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0。 31.jar:9.0.31] org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)中的
〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE ]
在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)〜[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
在组织.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.ApplicationFilterChain。 doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
在org.apache.catalin a.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)〜[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve .java:96)[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)[tomcat-embed- core-9.0.31.jar:9.0.31] org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)中的
[tomcat-embed-core-9.0.31.jar:9.0。 31] org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)中的
[tomcat-embed-core-9.0.31.jar:9.0.31] org.apache中的
.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)[tomcat-embed-core-9.0.31.jar:9.0.31]
在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter .java:343)[tomcat-embed-core-9.0.31.jar:9.0.31]
,位于org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)[tomcat-embed-核心-9.0.31。 jar:9.0.31] org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)中的
[tomcat-embed-core-9.0.31.jar:9.0.31] org中的
.apache.coyote.AbstractProtocol $ ConnectionHandler.process(AbstractProtocol.java:868)[tomcat-embed-core-9.0.31.jar:9.0.31]
,位于org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1639)[tomcat-embed-core-9.0.31.jar:9.0.31]
,位于org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java :49)[tomcat-embed-core-9.0.31.jar:9.0.31]
,位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)[na:1.8.0_232]
在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)[na:1.8.0_232]
在org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread .java:61)[tomcat-embed-core-9.0.31.jar:9.0.31]
,位于java.lang.Thread.run(Thread.java:748)[na:1.8.0_232]
在那里我需要做一些其他的事情来将它们转换为JSON格式吗?
我重新设计了Java SDK帮助程序,以修复并添加了两个问题:
- 修复了一个试图预订所有搜索航班的错误。
- 添加了一种新方法,使您可以使用单个FlightOfferSearch(而不是数组)进行预订
- 我添加了一种从FlightPrice对象进行预订的方法。从理论上讲,您不应该直接从FlightOfferSearch预订机票,而应该在预订前调用Flight Offers Price API以确认价格和空房。您可以找到一个例子。您可以在。
对于您的信息,如果以下情况,我们所有的API均支持JSON Direclty(在String或JsonObject中):我们的任何帮助者都无法使用该方法(获取您的对象,将其反序列化为String / JSON并直接使用它)。
我发布了新版本的SDK版本 4.1.0
,请更新到此版本。
If I try to return FlightOfferSearch[] or FlightOrder objects from a handler method of my Spring Boot REST Controller, they don't seem to get serialized correctly like simpler POJOs I've worked with before where Jackson handled JSON serialization.
My code (actual API calls mostly identical to the SDK github example):
import com.amadeus.Amadeus;
import com.amadeus.Params;
import com.amadeus.exceptions.ResponseException;
import com.amadeus.resources.FlightOfferSearch;
import com.amadeus.resources.FlightOrder;
import com.amadeus.resources.Traveler;
import io.github.cdimascio.dotenv.Dotenv;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Objects;
@RequestMapping("api/v1")
@RestController
public class TestController {
private static Amadeus getFreshAccessToken() {
Dotenv dotenv = Dotenv.load();
return Amadeus
.builder(Objects.requireNonNull(dotenv.get("AMADEUS_KEY")), Objects.requireNonNull(dotenv.get("AMADEUS_SECRET")))
.build();
}
@GetMapping("/test")
FlightOrder testHandler() throws ResponseException {
Amadeus amadeus = getFreshAccessToken();
Traveler traveler = new Traveler();
traveler.setId("1");
traveler.setDateOfBirth("2000-04-14");
traveler.setName(traveler.new Name("JORGE", "GONZALES"));
Traveler.Phone[] phone = new Traveler.Phone[1];
phone[0] = traveler.new Phone();
phone[0].setCountryCallingCode("33");
phone[0].setNumber("675426222");
phone[0].setDeviceType("MOBILE");
Traveler.Contact contact = traveler.new Contact();
contact.setPhones(phone);
traveler.setContact(contact);
Traveler.Document[] document = new Traveler.Document[1];
document[0] = traveler.new Document();
document[0].setDocumentType("PASSPORT");
document[0].setNumber("480080076");
document[0].setExpiryDate("2022-10-11");
document[0].setIssuanceCountry("ES");
document[0].setNationality("ES");
document[0].setHolder(true);
traveler.setDocuments(document);
Traveler[] travelerArray = new Traveler[1];
travelerArray[0] = traveler;
System.out.println(travelerArray[0]);
FlightOfferSearch[] flightOffersSearches = amadeus.shopping.flightOffersSearch.get(
Params.with("originLocationCode", "SYD")
.and("destinationLocationCode", "BKK")
.and("departureDate", "2020-11-01")
.and("returnDate", "2020-11-08")
.and("adults", 1)
.and("max", 1));
FlightOrder order = amadeus.booking.flightOrders.post(flightOffersSearches, travelerArray);
return order;
}
}
Postman requests return:
"status": 500,
"error": "Internal Server Error",
"message": "JSON mapping problem: com.amadeus.resources.FlightOrder[\"response\"]->com.amadeus.Response[\"result\"]->com.google.gson.JsonObject[\"asBoolean\"]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: JsonObject (through reference chain: com.amadeus.resources.FlightOrder[\"response\"]->com.amadeus.Response[\"result\"]->com.google.gson.JsonObject[\"asBoolean\"])",
and the server logs
ERROR 45864 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: JSON mapping problem: com.amadeus.resources.FlightOrder["response"]->com.amadeus.Response["result"]->com.google.gson.JsonObject["asBoolean"]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: JsonObject (through reference chain: com.amadeus.resources.FlightOrder["response"]->com.amadeus.Response["result"]->com.google.gson.JsonObject["asBoolean"])] with root cause
java.lang.UnsupportedOperationException: JsonObject
at com.google.gson.JsonElement.getAsBoolean(JsonElement.java:153) ~[gson-2.8.5.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_232]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_232]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_232]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_232]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:688) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1433) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:921) ~[jackson-databind-2.10.2.jar:2.10.2]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:294) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:287) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:181) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:124) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.31.jar:9.0.31]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.4.RELEASE.jar:5.2.4.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) [tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1639) [tomcat-embed-core-9.0.31.jar:9.0.31]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.31.jar:9.0.31]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_232]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_232]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.31.jar:9.0.31]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_232]
Is there something else I need to do to convert them to JSON format?
I reworked the Java SDK helpers to fix and add a couple of things:
- Fix a bug that was trying to book all the flights of the search.
- Added a new method allowing you to book using a single FlightOfferSearch (not an array)
- I added a method to book from a FlightPrice object. In theory, you shouldn't book from a FlightOfferSearch directly, you should call the Flight Offers Price API to confirm the price and availability before booking. You can find an example here. You can learn more about the flight booking flow in this tutorial.
For your information, all our APIs support the post with a JSON direclty (in String or in JsonObject) if any of our helpers fail you can use that method (take your object, deserialize it in String/JSON and use it directly).
I released a new version of the SDK version 4.1.0
please update to this version.
这篇关于如何将FlightOfferSearch和FlightOrder对象返回为JSON?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!