【发布时间】: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 中使用泛型参数,如果我使用我提供的代码正确地做到了这一点,那么我该怎么做?
-
你为什么不看我的第一条评论?它回答了这个问题。不要使用原始类型。程序到接口。