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:
- Nombre de image dibujable inaccesible en Kotlin?
- Efectos secundarios condicionales y types opcionales en Kotlin
- Kotlin y Spark: problemas de SAM
- Falta el constructor para DialogPreference
- Kotlin después de 60 segundos detener la toma de logging de voz
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]
- ¿Por qué obtengo el error java.lang.IllegalStateException: instancia no inicializada?
- Excepción UninfernetworkingParameterTypeConstructor durante la compilation cuando los parameters generics no se especifican explícitamente
- falla en la construcción de Travis ci - causa: espacio PermGen
- Establecer el setter de una interfaz en la class que lo implementa
- Kotlin devuelve el mismo object del método Factory
- ¿Cómo funciona el ejemplo de los numbers primos de la documentation de Corotines de Kotlin?
- Dagger 2 ContributesAndroidInjector proporciona actividad al module
- Advertencia de Android Studio Kotlin Compiler
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()
ypublic 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á.
- Una class simple de kotlin con testing de mockito provocó MissingMethodInvocationException
- Enrutamiento de contenido estático en VertX