【问题标题】:Jackson Java generic parameterJackson Java 泛型参数
【发布时间】:2017-07-04 16:28:44
【问题描述】:

我想提供一个 DTO 以在具有通用参数的 Jackson REST 端点中使用。

但我在构建时收到此错误。

[ERROR] Failed to execute goal org.bsc.maven:maven-processor-plugin:1.3.6:process (default) on project metrics-server: java.lang.UnsupportedOperationException: Unknown parameterized type: T. Available types in this context: {V=null, K=java.lang.String}. -> [Help 1]

public class ValidationRequest<T> {

    private final Map<String, T> columnValues;

    @JsonCreator
    public ValidationRequest @JsonProperty("columnValues") Map<String, T> columnValues) {

    this.columnValues = columnValues;
    }
}

我的用法是这样的:

    Map<String, Double> testColumnValue = new HashMap<>();
    testColumnValue.put("sum", 1.0);

    ValidationRequest validationRequest = new ValidationRequest(columnValues);
    user.validate(validationRequest);  // this is a REST request

Can anyone help me figure out if this is possible?


Here is the stack trace:
[ERROR] execute error
java.lang.RuntimeException: java.lang.UnsupportedOperationException: Unknown parameterized type: T. Available types in this context: {V=null, K=java.lang.String}.
    at com.sun.tools.javac.main.Main.compile(Main.java:553)
    at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
    at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
    at org.bsc.maven.plugin.processor.AbstractAnnotationProcessorMojo.executeWithExceptionsHandled(AbstractAnnotationProcessorMojo.java:248)
    at org.bsc.maven.plugin.processor.AbstractAnnotationProcessorMojo.execute(AbstractAnnotationProcessorMojo.java:129)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: java.lang.UnsupportedOperationException: Unknown parameterized type: T. Available types in this context: {V=null, K=java.lang.String}.
    at org.versly.rest.wsdoc.AnnotationProcessor$TypeVisitorImpl.getDeclaredTypeForTypeVariable(AnnotationProcessor.java:711)
    at org.versly.rest.wsdoc.AnnotationProcessor$TypeVisitorImpl.visitTypeVariable(AnnotationProcessor.java:694)
    at org.versly.rest.wsdoc.AnnotationProcessor$TypeVisitorImpl.visitTypeVariable(AnnotationProcessor.java:461)
    at com.sun.tools.javac.code.Type$TypeVar.accept(Type.java:1337)
    at org.versly.rest.wsdoc.AnnotationProcessor$TypeVisitorImpl.acceptOrRecurse(AnnotationProcessor.java:566)
    at org.versly.rest.wsdoc.AnnotationProcessor$TypeVisitorImpl.visitDeclared(AnnotationProcessor.java:543)
    at org.versly.rest.wsdoc.AnnotationProcessor$TypeVisitorImpl.visitDeclared(AnnotationProcessor.java:461)
    at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:944)
    at org.versly.rest.wsdoc.AnnotationProcessor.jsonTypeForDeclaredType(AnnotationProcessor.java:418)
    at org.versly.rest.wsdoc.AnnotationProcessor.access$300(AnnotationProcessor.java:63)
    at org.versly.rest.wsdoc.AnnotationProcessor$TypeVisitorImpl.recurseForJsonType(AnnotationProcessor.java:667)
    at org.versly.rest.wsdoc.AnnotationProcessor$TypeVisitorImpl.addFieldFromBeanMethod(AnnotationProcessor.java:646)
    at org.versly.rest.wsdoc.AnnotationProcessor$TypeVisitorImpl.buildTypeContents(AnnotationProcessor.java:616)
    at org.versly.rest.wsdoc.AnnotationProcessor$TypeVisitorImpl.buildType(AnnotationProcessor.java:575)
    at org.versly.rest.wsdoc.AnnotationProcessor$TypeVisitorImpl.visitDeclared(AnnotationProcessor.java:560)
    at org.versly.rest.wsdoc.AnnotationProcessor$TypeVisitorImpl.visitDeclared(AnnotationProcessor.java:461)
    at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:944)
    at org.versly.rest.wsdoc.AnnotationProcessor.jsonTypeForDeclaredType(AnnotationProcessor.java:418)
    at org.versly.rest.wsdoc.AnnotationProcessor.jsonTypeFromTypeMirror(AnnotationProcessor.java:391)
    at org.versly.rest.wsdoc.AnnotationProcessor.buildRequestBody(AnnotationProcessor.java:288)
    at org.versly.rest.wsdoc.AnnotationProcessor.buildRequestBodies(AnnotationProcessor.java:284)
    at org.versly.rest.wsdoc.AnnotationProcessor.buildParameterData(AnnotationProcessor.java:254)
    at org.versly.rest.wsdoc.AnnotationProcessor.processRequestMappingMethod(AnnotationProcessor.java:233)
    at org.versly.rest.wsdoc.AnnotationProcessor.processElements(AnnotationProcessor.java:126)
    at org.versly.rest.wsdoc.AnnotationProcessor.process(AnnotationProcessor.java:87)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
    at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
    at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
    at com.sun.tools.javac.main.Main.compile(Main.java:523)
    ... 26 more

我已经更改了原帖中构造函数的名称,希望这是一个更清晰的例子。

【问题讨论】:

  • 不要使用原始类型。 ValidationRequest 是一个泛型类型。所以validationRequest 应该是ValidationRequest 类型,而不是ValidationRequest。您应该对接口进行编程:Map,而不是 HashMap。最后,当您询问异常时,请务必发布异常的完整堆栈跟踪以及相关代码。
  • 在 DTO 中使用 DTO 的位置​​进行更改并不能解决问题。我将堆栈跟踪添加到 OP。
  • 我不知道你的评论是什么意思。我所知道的是您发布的代码无法编译,并且您没有应用我建议的任何更改。现在,至少,我们知道问题发生在构建期间,并且是由 versly(我对此一无所知)引起的,您应该将其添加到您的标签中。
  • 我最初的问题是如何在 Jackson DTO 中使用泛型参数,如果我使用我提供的代码正确地做到了这一点,那么我该怎么做?
  • 你为什么不看我的第一条评论?它回答了这个问题。不要使用原始类型。程序到接口。

标签: java rest jackson dto


【解决方案1】:

请发布带有单元测试的Minimal, Complete, and Verifiable example,以表明您做出了一些努力。由于以下几个原因,您的代码对我来说毫无意义:

  1. 您的代码将无法编译 - 您在类 ValidationRequest 中有一些未知类型 InfluxValidationRequest,它看起来像构造函数,但不是。
  2. 有一个东西叫做type erasure,所以Map&lt;String, Double&gt; 在运行时只是一个原始的Map
  3. 为什么不拥有知道如何验证Double 值、Integer 值等等的不同验证器实例?所谓的验证码在哪里?

【讨论】:

  • 抱歉,我将 InfluxValidationRequest 更改为 ValidationRequest,错字。我希望在 Map 中使用一个具有泛型类型的 DTO 来做到这一点。这是一个更大的服务的一部分,很难发布到足以编译的内容。
  • @mrmannione “我希望这样做” - 这是什么?除了 POJO,您的问题中没有太多说明您要做什么。如果您不能花时间重现一个较小的示例,我认为我无法通过查看最少的代码来帮助您。
猜你喜欢
  • 2012-11-15
  • 2011-10-14
  • 1970-01-01
  • 2010-12-18
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多