You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

java.lang.NoSuchMethodError: java.time.Instant.<init>()错误修复求助

问题:POST请求解析Instant类型时抛出NoSuchMethodError错误

发送POST请求时遇到错误java.lang.NoSuchMethodError: java.time.Instant.<init>(),请求体中expires字段传的是整数0,但Java实体类里该字段是Instant类型,Swagger模型定义为integer($int64),推测是请求值格式不匹配导致,需要修复该问题或实现错误的正确捕获。


请求体示例

{
  "accountId": "string",
  "name": "string",
  "value": "string",
  "expires": 0
}

Swagger模型定义

AccountClientIdentifierEntity{
accountId   string
name    string
value   string
expires integer($int64)
}

Java实体类代码

/**
 * 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;
    }

    // getters & setters
}

REST服务代码

@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();
}

堆栈跟踪信息

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

解决方案

1. 修复Instant类型的序列化/反序列化

java.time.Instant是不可变类,无空参构造函数,JAXB默认无法直接处理,需要添加适配器或注解:

方式一:自定义JAXB适配器

创建适配器类:

public class InstantAdapter extends XmlAdapter<Long, Instant> {
    @Override
    public Instant unmarshal(Long value) throws Exception {
        return value == null ? null : Instant.ofEpochMilli(value);
    }

    @Override
    public Long marshal(Instant value) throws Exception {
        return value == null ? null : value.toEpochMilli();
    }
}

在实体类的expires字段上添加注解:

@XmlJavaTypeAdapter(InstantAdapter.class)
private Instant expires;

方式二:使用Jackson注解(若项目支持)

如果用Jackson处理JSON,添加注解指定格式:

// 时间戳格式
@JsonFormat(shape = JsonFormat.Shape.NUMBER)
private Instant expires;

// 或ISO-8601字符串格式
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Instant expires;

2. 修正Swagger模型定义

根据选择的格式调整Swagger中的expires类型:

  • 时间戳格式:保留integer($int64)
  • ISO字符串格式:改为string($date-time)

3. 统一请求体格式

发送对应格式的expires值:

  • 时间戳示例:"expires": 1700000000000
  • ISO字符串示例:"expires": "2023-10-15T14:48:00.000Z"

4. 添加错误捕获逻辑

修改REST方法,捕获异常并返回友好错误:

@POST
@Path("/identifiers")
@ApiOperation(value = "Add a new account client identifier")
@ApiResponses(value = {
        @ApiResponse(code = 201, message = "Created"),
        @ApiResponse(code = 400, message
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:40:18