Spring Boot Kotlin Jersey ModelValidationException

Estoy intentando que Spring Boot + Jersey trabaje con Kotlin. Configuré la forma en que normalmente lo haría en Java, pero obteniendo la siguiente stacktrace. Parece indicar que el controller está siendo instanciado dos veces, pero no debería.

Aquí está mi class 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 (punto final 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(); } } 

Stacktrace:

 2016-09-06 15:26:26.529 ERROR 17332 --- [nio-8080-exec-1] oaccC[.[.[.[.jicJerseyConfig] : 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='org.glassfish.jersey.server.model.RuntimeResource@1b6cce78'] 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] 

El problema es que la siguiente propiedad:

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

Genera un método que a nivel de JVM tiene una firma siguiente:

 @NotNull public final List<Genre> getGenres() 

Como puede ver, entra en conflicto con el otro método en su controller. Para resolverlo, cambie la propiedad para que sea private o cambie el nombre de uno de los methods.

PD. El post de error es bastante claro sobre el problema:

public javax.ws.rs.core.Response com.joescodeshack.igdb.controller.GenreController.getGenres() y public final java.util.List com.joescodeshack.igdb.controller.GenreController.getGenres() en la coincidencia de expresiones regulares / género . Estos dos methods producen y consumen exactamente los mismos types de mime y, por lo tanto, su invocación como método de resources siempre fallará.

  • RxJava 1.x .zip () no funciona en RxJava 2.0
  • Persistencia de la habitación: Error: las entidades y Pojos deben tener un constructor público utilizable
  • ¿Por qué no se puede escribir un parámetro en Kotlin que tenga otros límites si está limitado por otro parámetro de tipo?
  • Spring PropertySources cargado pero no aplicado en Pruebas
  • Llamadas lambda anidadas en Kotlin
  • Kotlin, problema de creación de instancias y genérico
  • Kotlin reference no resuelta linkedListOf
  • Funciones de mayor order de Kotlin en el proyecto de Java
  • Handler () postDelay no está disponible para este código de Kotlin, ¿cómo solucionarlo?
  • No se puede establecer OnItemClickListener for spinner en Android
  • ¿Cómo puedo get el time que lleva una function probar el performance de las funciones en Kotlin?