Amb*_*ans 3 java rest exception swagger
java.lang.NoSuchMethodError: java.time.Instant.<init>()当我在rest-API文档(招摇)中尝试使用以下json作为正文进行发布请求时,出现错误:
{
"accountId": "string",
"name": "string",
"value": "string",
"expires": 0
}
Run Code Online (Sandbox Code Playgroud)
这映射到模型:
AccountClientIdentifierEntity{
accountId string
name string
value string
expires integer($int64)
}
Run Code Online (Sandbox Code Playgroud)
现在在我的Java代码中,这个expires属性实际上是一个Instant,但它在某种程度上被解析为一个Integer,所以我想我的问题就在这里,当我用“0”而不是Instant发布时。有人可以帮我解决这个问题,或者至少正确地捕获错误吗?
完整代码: 实体:
/**
* The Class UserEntity.
*/
@XmlRootElement(name = "accountClientIdentifier")
@XmlType(propOrder = { "accountId", "name", "value", "expires"})
@JsonInclude(JsonInclude.Include.NON_NULL)
public class AccountClientIdentifierEntity {
public static void registerToContextProvider(){
try {
CustomContextProvider.registerClass(com.inteno.iopsys.plugin.restapi.entity.AccountClientIdentifierEntity.class);
} catch (Exception e){
Log.error("Could not register AccountClientIdentifierEntity: "+e.getMessage());
}
}
/** The username. */
private String accountId;
/** The name. */
private String name;
/** The value. */
private String value;
/** expires. */
private Instant expires;
/**
* Instantiates a new user entity.
*/
public AccountClientIdentifierEntity() {
}
/**
* Instantiates a new user entity.
*
* @param accountId
* the account ID
* @param name
* the name
* @param value
* the value
*/
public AccountClientIdentifierEntity(String accountId, String name, String value) {
this.accountId = accountId;
this.name = name;
this.value = value;
}
Run Code Online (Sandbox Code Playgroud)
服务路径:
@POST
@Path("/identifiers")
@ApiOperation(value = "Add a new account client identifier")
@ApiResponses(value = {@ApiResponse(code = 201, message = "Created")})
public Response createAccountClientId(
@ApiParam(value = "The new identifier to create", required = true) AccountClientIdentifierEntity accountClientIdentifierEntity
) throws ServiceException {
controller.createOrUpdateAccountClientIdentifier(accountClientIdentifierEntity);
return Response.status(Response.Status.CREATED).build();
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
2023.01.05 09:25:21 WARN [Jetty-QTP-API-1-821]: HttpChannel.java:700 - /restapi/v1/account/identifiers
java.lang.NoSuchMethodError: java.time.Instant.<init>()
at com.sun.xml.bind.v2.ClassFactory.tryGetDeclaredConstructor(ClassFactory.java:115) ~[jaxb-runtime-2.3.2.jar:2.3.2]
at com.sun.xml.bind.v2.ClassFactory.create0(ClassFactory.java:76) ~[jaxb-runtime-2.3.2.jar:2.3.2]
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.createInstance(ClassBeanInfoImpl.java:255) ~[jaxb-runtime-2.3.2.jar:2.3.2]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(UnmarshallingContext.java:672) ~[jaxb-runtime-2.3.2.jar:2.3.2]
at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.startElement(StructureLoader.java:158) ~[jaxb-runtime-2.3.2.jar:2.3.2]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:547) ~[jaxb-runtime-2.3.2.jar:2.3.2]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:526) ~[jaxb-runtime-2.3.2.jar:2.3.2]
at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:45) ~[jaxb-runtime-2.3.2.jar:2.3.2]
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:216) ~[jaxb-runtime-2.3.2.jar:2.3.2]
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:150) ~[jaxb-runtime-2.3.2.jar:2.3.2]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:385) ~[jaxb-runtime-2.3.2.jar:2.3.2]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:364) ~[jaxb-runtime-2.3.2.jar:2.3.2]
at com.sun.jersey.json.impl.BaseJSONUnmarshaller.unmarshalJAXBElementFromJSON(BaseJSONUnmarshaller.java:111) ~[?:?]
at com.sun.jersey.json.impl.BaseJSONUnmarshaller.unmarshalFromJSON(BaseJSONUnmarshaller.java:100) ~[?:?]
at com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider.readFrom(JSONRootElementProvider.java:154) ~[?:?]
at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.readFrom(AbstractRootElementProvider.java:111) ~[?:?]
at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:490) ~[?:?]
at com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123) ~[?:?]
at com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:86) ~[?:?]
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153) ~[?:?]
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203) ~[?:?]
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) ~[?:?]
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) ~[?:?]
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) ~[?:?]
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) ~[?:?]
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) ~[?:?]
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) ~[?:?]
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542) ~[?:?] at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473) ~[?:?] at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419) ~[?:?]
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409) ~[?:?]
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409) ~[?:?]
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:558) ~[?:?]
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:733) ~[?:?]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) ~[jetty-servlet-api-4.0.6.jar:?]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764) ~[jetty-servlet-10.0.5.jar:10.0.5]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:508) ~[jetty-servlet-10.0.5.jar:10.0.5] at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221) ~[jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1373) ~[jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176) ~[jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:463) ~[jetty-servlet-10.0.5.jar:10.0.5]
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174) ~[jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1295) ~[jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129) ~[jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:51) ~[jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122) ~[jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.server.Server.handle(Server.java:562) ~[jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.server.HttpChannel.lambda$handle$0(HttpChannel.java:399) ~[jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:656) ~[jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:391) [jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:282) [jetty-server-10.0.5.jar:10.0.5]
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:319) [jetty-io-10.0.5.jar:10.0.5]
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100) [jetty-io-10.0.5.jar:10.0.5]
at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:538) [jetty-io-10.0.5.jar:10.0.5]
at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:387) [jetty-io-10.0.5.jar:10.0.5]
at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:161) [jetty-io-10.0.5.jar:10.0.5]
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100) [jetty-io-10.0.5.jar:10.0.5]
at org.eclipse.jetty.io.SocketChannelEndPoint$1.run(SocketChannelEndPoint.java:101) [jetty-io-10.0.5.jar:10.0.5] at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333) [jetty-util-10.0.5.jar:10.0.5]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310) [jetty-util-10.0.5.jar:10.0.5]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168) [jetty-util-10.0.5.jar:10.0.5]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126) [jetty-util-10.0.5.jar:10.0.5]
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:378) [jetty-util-10.0.5.jar:10.0.5]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:894) [jetty-util-10.0.5.jar:10.0.5]
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1038) [jetty-util-10.0.5.jar:10.0.5]
at java.lang.Thread.run(Thread.java:834) [?:?]
Caused by: java.lang.NoSuchMethodException: java.time.Instant.<init>()
at java.lang.Class.getConstructor0(Class.java:3350) ~[?:?]
at java.lang.Class.getDeclaredConstructor(Class.java:2554) ~[?:?]
at com.sun.xml.bind.v2.ClassFactory.tryGetDeclaredConstructor(ClassFactory.java:107) ~[jaxb-runtime-2.3.2.jar:2.3.2]
... 65 more
Run Code Online (Sandbox Code Playgroud)
您要求 JAXB 将挂钩(从 JSON 接收的数字值和 swagger 的标识符 $int64)放入孔(类Instant expires;中的字段AccountClientIdentifierEntity)中。
原来,这是一个方钉和一个圆孔。JAXB 尽最大努力,鉴于它不知道Instant可能是什么,正在计划构建一个,也许会找到一个集合方法。然而,事实并非如此Instant。您正在专门寻找Instant.ofEpochSecondor ofEpochMilli,我们现在真正进入这里的根本问题: $int64 到底是什么意思?是自1970年以来的秒数吗?毫秒?纳米弗隆?也许是自 1902 年以来的几天,使用小数表示小时和秒?
要求 JAXB 进行疯狂的尝试似乎不合理,事实上,这不是 JAXB 可以做的事情,也永远不会做。你必须告诉它要做什么。
为此,您需要告诉 JAXB 有一个可用于该字段的特定解组器。
注释@XmlJavaTypeAdapter应该能够完成这项工作;您可以expires用它注释该字段,将类引用传递给实现XmlAdapter.
该jaxb-java-time-adapters项目在这里可能有用;可能只有查看源代码才能知道该怎么做。