2016-09-06 75 views
1

我试图让Spring Boot + Jersey与Kotlin一起工作。我配置了我通常在Java中的方式,但获得了以下堆栈跟踪。它似乎表明控制器正在实例化两次,但它不应该。Spring Boot Kotlin Jersey ModelValidationException

这里是我JerseyConfig类:

package com.joescodeshack.igdb.config 

import com.fasterxml.jackson.module.kotlin.KotlinModule 
import com.joescodeshack.igdb.controller.GenreController 
import org.glassfish.jersey.server.ResourceConfig 
import org.springframework.context.annotation.Bean 
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder 
import org.springframework.stereotype.Component 
import javax.ws.rs.ApplicationPath 

@Component 
@ApplicationPath("/api") 
open class JerseyConfig : ResourceConfig { 

    constructor() { 
     register(GenreController()); 
    } 

    @Bean 
    open fun objectMapperBuilder(): Jackson2ObjectMapperBuilder 
      = Jackson2ObjectMapperBuilder().modulesToInstall(KotlinModule()) 
} 

GenreController(JAX-RS端点)

package com.joescodeshack.igdb.controller 

import com.joescodeshack.igdb.domain.Genre 
import javax.ws.rs.GET 
import javax.ws.rs.Path 
import javax.ws.rs.Produces 
import javax.ws.rs.core.MediaType 
import javax.ws.rs.core.Response 

@Path("/genre") 
open class GenreController { 

    val genres : List<Genre> = listOf(Genre(1,"Butt"), Genre(2, "Cow")) 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    open fun getGenres() : Response { 
     return Response.ok(genres).build(); 
    } 
} 

堆栈跟踪:

2016-09-06 15:26:26.529 ERROR 17332 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[.[.j.i.c.JerseyConfig] : Allocate exception for servlet com.joescodeshack.igdb.config.JerseyConfig 

org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization. 
[[FATAL] A resource model has ambiguous (sub-)resource method for HTTP method GET and input mime-types as defined by"@Consumes" and "@Produces" annotations at Java methods public javax.ws.rs.core.Response com.joescodeshack.igdb.controller.GenreController.getGenres() and public final java.util.List com.joescodeshack.igdb.controller.GenreController.getGenres() at matching regular expression /genre. These two methods produces and consumes exactly the same mime-types and therefore their invocation as a resource methods will always fail.; source='[email protected]'] 
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:555) ~[jersey-server-2.23.1.jar:na] 
    at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:184) ~[jersey-server-2.23.1.jar:na] 
    at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:350) ~[jersey-server-2.23.1.jar:na] 
    at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:347) ~[jersey-server-2.23.1.jar:na] 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) ~[jersey-common-2.23.1.jar:na] 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) ~[jersey-common-2.23.1.jar:na] 
    at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255) ~[jersey-common-2.23.1.jar:na] 
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:347) ~[jersey-server-2.23.1.jar:na] 
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:392) ~[jersey-container-servlet-core-2.23.1.jar:na] 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177) ~[jersey-container-servlet-core-2.23.1.jar:na] 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369) ~[jersey-container-servlet-core-2.23.1.jar:na] 
    at javax.servlet.GenericServlet.init(GenericServlet.java:158) ~[tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1194) ~[tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:806) ~[tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:133) ~[tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_102] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_102] 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_102] 

回答

2

的问题在于以下属性:

val genres : List<Genre> = listOf(Genre(1,"Butt"), Genre(2, "Cow")) 

生成一个JVM上水平具有以下签名的方法:

@NotNull 
public final List<Genre> getGenres() 

正如你可以看到它在你的控制器中的其他方法冲突。要解决它,请将属性更改为private或重命名其中一种方法。

PS。该错误消息是有关该问题很清楚:

public javax.ws.rs.core.Response com.joescodeshack.igdb.controller.GenreController.getGenres()public final java.util.List com.joescodeshack.igdb.controller.GenreController.getGenres()在 匹配的正则表达式/流派。这两种方法产生和 消耗完全相同的MIME类型,因此它们的调用为 资源方法总是会失败。

+0

为什么代码能够编译? – voddan

+1

@voddan [JVM允许这个](http://stackoverflow.com/a/36701687/155213)和从Kotlin的角度来看,getter和method是可区分的。我不知道,如果这应该是一个错误,因为它在Java中被禁止。 – miensol

+0

谢谢你的链接,确实很奇怪。我确定这是kotlinc中的“冲突jvm签名错误” – voddan

相关问题