繁体   English   中英

Quarkus com.fasterxml.jackson.databind.exc.InvalidDefinitionException:未找到 class 的序列化程序

[英]Quarkus com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class

我正在使用quarkus调用web服务,该服务需要header中的object进行认证:

public class UserInfoDto {

    private String jwtToken;
    private String pgeToken;

    public UserInfoDto(String jwtToken, String pgeToken) {
        this.jwtToken = jwtToken;
        this.pgeToken = pgeToken;
    }

    public String getJwtToken() {
        return jwtToken;
    }

    public void setJwtToken(String jwtToken) {
        this.jwtToken = jwtToken;
    }

    public String getPgeToken() {
        return pgeToken;
    }

    public void setPgeToken(String pgeToken) {
        this.pgeToken = pgeToken;
    }

    @Override
    public String toString() {
        return "UserInfoDto{" +
                "jwtToken='" + jwtToken + '\'' +
                ", pgeToken='" + pgeToken + '\'' +
                '}';
    }
}

然后在生成 header 的 class 中,我正在这样做:

@ApplicationScoped
public class RequestUserInfoHeaderFactory implements ClientHeadersFactory {

    @Inject
    PreTokenRetriever preTokenRetriever;

    @Inject
    ObjectMapper mapper;

    private static final String USER_INFO_HEADER = "user-info";

    @Override
    public MultivaluedMap<String, String> update(MultivaluedMap<String, String> incomingHeaders, MultivaluedMap<String, String> clientOutgoingHeaders) {
        MultivaluedMap<String, String> result = new MultivaluedHashMap<>();
        try {
            OpenIdToken token = preTokenRetriever.getToken();
            UserInfoDto userInfoDto = new UserInfoDto(token.getId_token(), token.getAccess_token());
            System.out.println("Called pre results:" + userInfoDto);
            result.add(USER_INFO_HEADER, mapper.writeValueAsString(userInfoDto));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return result;
    }
}

当我使用mvn quarkus:dev启动应用程序时,一切都很好:

__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2022-08-02 17:17:04,000 INFO  [io.quarkus] (Quarkus Main Thread) udp-rmq-pub-unpub-quest-cron 1.0.3-SNAPSHOT on JVM (powered by Quarkus 2.10.3.Final) started in 1.758s. 
2022-08-02 17:17:04,008 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2022-08-02 17:17:04,009 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, rest-client, rest-client-jackson]
Calling procedure
2022-08-02 17:17:04,365 INFO  [OpenIdProvider] (Quarkus Main Thread) OpenId Provider. Contacting endpoint https://***/PRE-EBA-RS/service/SSOToken/generate
2022-08-02 17:17:04,394 INFO  [OpenIdProvider] (Quarkus Main Thread) OpenId Provider. Auth-Scheme=Basic
2022-08-02 17:17:04,397 INFO  [OpenIdProvider] (Quarkus Main Thread) OpenId Provider. Input body {"tokenType":"openId","tokenConsumerURL":null,"attributes":[{"name":"client_id","values":["UDP-001"]},{"name":"response_type","values":["id_token"]}]}
2022-08-02 17:17:04,656 INFO  [OpenIdProvider] (Quarkus Main Thread) OpenId Provider. Response with httpCode=200
Called pre results:UserInfoDto{jwtToken='***', pgeToken='null'}
Done
2022-08-02 17:17:06,117 INFO  [io.quarkus] (Quarkus Main Thread) udp-rmq-pub-unpub-quest-cron stopped in 0.017s

但是当我在 docker 容器内的云上部署时(quarkus 是本地构建的,我不知道这是否重要)我得到了:

2022-08-02 15:12:43,753 ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class eu.unicredit.regulatoryTool.common.model.UserInfoDto and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300)
    at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:46)
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:29)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
    at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4568)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3821)
    at eu.unicredit.regulatoryTool.rest.client.RequestUserInfoHeaderFactory.update(RequestUserInfoHeaderFactory.java:32)
    at eu.unicredit.regulatoryTool.rest.client.RequestUserInfoHeaderFactory_ClientProxy.update(Unknown Source)
    at org.jboss.resteasy.microprofile.client.header.ClientHeadersRequestFilter.lambda$filter$4(ClientHeadersRequestFilter.java:61)
    at java.util.Optional.ifPresent(Optional.java:183)
    at org.jboss.resteasy.microprofile.client.header.ClientHeadersRequestFilter.filter(ClientHeadersRequestFilter.java:61)
    at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.filterRequest(ClientInvocation.java:767)
    at org.jboss.resteasy.microprofile.client.impl.MpClientInvocation.filterRequest(MpClientInvocation.java:75)
    at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:491)
    at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invokeSync(ClientInvoker.java:152)
    at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:115)
    at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76)
    at com.sun.proxy.$Proxy221.callProcedure(Unknown Source)
    at java.lang.reflect.Method.invoke(Method.java:566)
    at org.jboss.resteasy.microprofile.client.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:146)
    at com.sun.proxy.$Proxy222.callProcedure(Unknown Source)
    at eu.unicredit.regulatoryTool.rest.client.AdminQuestionnaireResource.callProcedure(AdminQuestionnaireResource.java:21)
    at eu.unicredit.regulatoryTool.rest.client.AdminQuestionnaireResource_ClientProxy.callProcedure(Unknown Source)
    at eu.unicredit.regulatoryTool.CronPubUnpubMain.run(CronPubUnpubMain.java:18)
    at eu.unicredit.regulatoryTool.CronPubUnpubMain_ClientProxy.run(Unknown Source)
    at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:124)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:67)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:41)
    at io.quarkus.runner.GeneratedMain.main(Unknown Source)

这太奇怪了,为什么我会收到这个错误? 我不想手动编组UserInfoDto它可以增长

有人可以帮忙吗?

您需要注册UserInfoDto以进行反射。 GraalVM 会移除应用程序似乎不使用的所有类、字段和方法。 而在使用反射时,大多数时候,它无法弄清楚它们是否被使用。

Quarkus 有一些机制来检测事物并自动注册一些类,但在您的情况下,您将 class 向右推到 Jackson 所以 Quarkus 无法检测到它。

只需将@RegisterForReflection注释添加到您的UserInfoDto class。

您可以在我们的文档中找到更多详细信息: https://quarkus.io/guides/writing-native-applications-tips#registering-for-reflection

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM