Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add support for Play 2.9 #14

Merged
merged 7 commits into from
Nov 1, 2023
Merged

add support for Play 2.9 #14

merged 7 commits into from
Nov 1, 2023

Conversation

dwickern
Copy link
Owner

@dwickern dwickern commented Oct 31, 2023

Fixes #13

  • Play's routes-compiler artifact was renamed to play-routes-compiler
  • Using swagger-core 1.6.11 which supports Jackson 2.14. swagger-core 1.6.12 depends on Jackson 2.15.

@dwickern
Copy link
Owner Author

@gmethvin any idea why this error happens on Play 2.9?

 Error: Exception in thread "specs2-3" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlRootElement
	at io.swagger.jackson.ModelResolver.resolve(ModelResolver.java:323)
	at io.swagger.jackson.ModelResolver.resolve(ModelResolver.java:205)
	at io.swagger.scala.converter.SwaggerScalaModelConverter.resolve(SwaggerScalaModelConverter.scala:90)
	at io.swagger.converter.ModelConverterContextImpl.resolve(ModelConverterContextImpl.java:103)
	at io.swagger.jackson.ModelResolver.resolve(ModelResolver.java:289)
	at io.swagger.jackson.ModelResolver.resolve(ModelResolver.java:205)
	at io.swagger.scala.converter.SwaggerScalaModelConverter.resolve(SwaggerScalaModelConverter.scala:90)
	at io.swagger.converter.ModelConverterContextImpl.resolve(ModelConverterContextImpl.java:103)
	at io.swagger.jackson.ModelResolver.resolveProperty(ModelResolver.java:177)
	at io.swagger.jackson.ModelResolver.resolveProperty(ModelResolver.java:128)
	at io.swagger.scala.converter.SwaggerScalaModelConverter.resolveProperty(SwaggerScalaModelConverter.scala:70)
	at io.swagger.converter.ModelConverterContextImpl.resolveProperty(ModelConverterContextImpl.java:83)
	at io.swagger.converter.ModelConverters.readAsProperty(ModelConverters.java:63)
	at io.swagger.converter.ModelConverters.readAsProperty(ModelConverters.java:57)
	at play.modules.swagger.PlayReader.parseMethod(PlayReader.java:538)
	at play.modules.swagger.PlayReader.read(PlayReader.java:147)
	at play.modules.swagger.PlayReader.read(PlayReader.java:76)
	at play.modules.swagger.PlayReader.read(PlayReader.java:70)
	at play.modules.swagger.ApiListingCache.$anonfun$listing$1(ApiListingCache.scala:17)
	at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:454)
	at play.modules.swagger.ApiListingCache.listing(ApiListingCache.scala:13)
	at PlayApiListingCacheSpec.$anonfun$new$2(PlayApiListingCacheSpec.scala:75)
	at org.specs2.matcher.MatchResult$$anon$12.$anonfun$asResult$1(MatchResult.scala:344)
	at org.specs2.execute.ResultExecution.execute(ResultExecution.scala:22)
	at org.specs2.execute.ResultExecution.execute$(ResultExecution.scala:21)
	at org.specs2.execute.ResultExecution$.execute(ResultExecution.scala:123)
	at org.specs2.execute.Result$$anon$4.asResult(Result.scala:246)
	at org.specs2.execute.AsResult$.apply(AsResult.scala:32)
	at org.specs2.matcher.MatchResult$$anon$12.asResult(MatchResult.scala:344)
	at org.specs2.execute.AsResult$.apply(AsResult.scala:32)
	at org.specs2.specification.core.AsExecution$$anon$1.$anonfun$execute$1(AsExecution.scala:17)
	at org.specs2.execute.ResultExecution.execute(ResultExecution.scala:22)
	at org.specs2.execute.ResultExecution.execute$(ResultExecution.scala:21)
	at org.specs2.execute.ResultExecution$.execute(ResultExecution.scala:123)
	at org.specs2.execute.Result$$anon$4.asResult(Result.scala:246)
	at org.specs2.execute.AsResult$.apply(AsResult.scala:32)
	at org.specs2.execute.AsResult$.$anonfun$safely$1(AsResult.scala:40)
	at org.specs2.execute.ResultExecution.execute(ResultExecution.scala:22)
	at org.specs2.execute.ResultExecution.execute$(ResultExecution.scala:21)
	at org.specs2.execute.ResultExecution$.execute(ResultExecution.scala:123)
	at org.specs2.execute.AsResult$.safely(AsResult.scala:40)
	at org.specs2.specification.core.Execution$.$anonfun$result$1(Execution.scala:340)
	at org.specs2.specification.core.Execution$.$anonfun$withEnvSync$3(Execution.scala:358)
	at org.specs2.execute.ResultExecution.execute(ResultExecution.scala:22)
	at org.specs2.execute.ResultExecution.execute$(ResultExecution.scala:21)
	at org.specs2.execute.ResultExecution$.execute(ResultExecution.scala:123)
	at org.specs2.execute.Result$$anon$4.asResult(Result.scala:246)
	at org.specs2.execute.AsResult$.apply(AsResult.scala:32)
	at org.specs2.execute.AsResult$.$anonfun$safely$1(AsResult.scala:40)
	at org.specs2.execute.ResultExecution.execute(ResultExecution.scala:22)
	at org.specs2.execute.ResultExecution.execute$(ResultExecution.scala:21)
	at org.specs2.execute.ResultExecution$.execute(ResultExecution.scala:123)
	at org.specs2.execute.AsResult$.safely(AsResult.scala:40)
	at org.specs2.specification.core.Execution$.$anonfun$withEnvSync$2(Execution.scala:358)
	at org.specs2.specification.core.Execution.$anonfun$startExecution$3(Execution.scala:142)
	at scala.concurrent.impl.Promise$Transformation.run(Promise.scala:431)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlRootElement
	at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:476)
	at sbt.internal.ManagedClassLoader.findClass(ManagedClassLoader.java:102)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:594)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527)
	... 59 more

@gmethvin
Copy link

gmethvin commented Nov 1, 2023

@dwickern Previously jakarta.xml.bind-api was a transitive dependency of Play, but it was removed since it is no longer needed (see removed libraries in the migration guide). The solution is to add the dependency yourself. If you upgrade to the latest version you'll have to switch to the jakarta package name.

@dwickern
Copy link
Owner Author

dwickern commented Nov 1, 2023

I'm afraid adding the dependency doesn't fix the error. Besides, jakarta.xml.bind-api is a transitive dependency of swagger-core.

@gmethvin
Copy link

gmethvin commented Nov 1, 2023

Actually I think we should just remove all the xml annotations. It appears they are meant to be used for toXmlString but the implementation is broken anyway.

@dwickern
Copy link
Owner Author

dwickern commented Nov 1, 2023

getResource seems broken too. The None case is unreachable and ErrorResponse isn't used anywhere else.

def getResource(path: String) = Action { implicit request =>
val host: String = swaggerPlugin.config.host
val apiListing: Swagger = getApiListing(path, host)
val response: String = returnXml(request) match {
case true => toXmlString(apiListing)
case false => toJsonString(apiListing)
}
Option(response) match {
case Some(help) => returnValue(request, help)
case None =>
val msg = new ErrorResponse(500, "api listing for path " + path + " not found")
Logger("swagger").error(msg.message)
if (returnXml(request)) {
InternalServerError(ByteString(toXmlString(msg))).as(XML(Codec.utf_8))
} else {
InternalServerError(ByteString(toJsonString(msg))).as(JSON)
}
}
}
}

@dwickern
Copy link
Owner Author

dwickern commented Nov 1, 2023

Removing the broken XML code didn't fix the issue either. Tests still fail:

[info] ApiListingCache should
[error]   ! load all API specs
[error]    org.specs2.specification.core.FatalExecution: java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlRootElement (ModelResolver.java:323)
[error] io.swagger.jackson.ModelResolver.resolve(ModelResolver.java:323)
[error] io.swagger.jackson.ModelResolver.resolve(ModelResolver.java:205)
[error] io.swagger.scala.converter.SwaggerScalaModelConverter.resolve(SwaggerScalaModelConverter.scala:90)
[error] io.swagger.converter.ModelConverterContextImpl.resolve(ModelConverterContextImpl.java:103)
[error] io.swagger.jackson.ModelResolver.resolve(ModelResolver.java:289)
[error] io.swagger.jackson.ModelResolver.resolve(ModelResolver.java:205)
[error] io.swagger.scala.converter.SwaggerScalaModelConverter.resolve(SwaggerScalaModelConverter.scala:90)
[error] io.swagger.converter.ModelConverterContextImpl.resolve(ModelConverterContextImpl.java:103)
[error] io.swagger.jackson.ModelResolver.resolveProperty(ModelResolver.java:177)
[error] io.swagger.jackson.ModelResolver.resolveProperty(ModelResolver.java:128)
[error] io.swagger.scala.converter.SwaggerScalaModelConverter.resolveProperty(SwaggerScalaModelConverter.scala:70)
[error] io.swagger.converter.ModelConverterContextImpl.resolveProperty(ModelConverterContextImpl.java:83)
[error] io.swagger.converter.ModelConverters.readAsProperty(ModelConverters.java:63)
[error] io.swagger.converter.ModelConverters.readAsProperty(ModelConverters.java:57)
[error] play.modules.swagger.PlayReader.parseMethod(PlayReader.java:538)
[error] play.modules.swagger.PlayReader.read(PlayReader.java:147)
[error] play.modules.swagger.PlayReader.read(PlayReader.java:76)
[error] play.modules.swagger.PlayReader.read(PlayReader.java:70)
[error] play.modules.swagger.ApiListingCache.$anonfun$listing$1(ApiListingCache.scala:17)
[error] play.modules.swagger.ApiListingCache.listing(ApiListingCache.scala:13)
[error] PlayApiListingCacheSpec.$anonfun$new$2(PlayApiListingCacheSpec.scala:75)

What does work is a dependency on javax.xml.bind rather than jakarta.xml.bind. I'm not sure why.

@gmethvin
Copy link

gmethvin commented Nov 1, 2023

ok, it's possible that the swagger library itself expects that library to exist. I suppose we can leave it like you have it. At least we cleaned up the broken code.

@dwickern dwickern merged commit 65f86a5 into master Nov 1, 2023
13 checks passed
@dwickern dwickern deleted the play-2.9 branch November 1, 2023 21:32
@dwickern
Copy link
Owner Author

dwickern commented Nov 1, 2023

Ok so next steps are

  1. Support for Scala 3
  2. Support for Play 3.0
  3. I'll need to somehow publish JDK 11 binaries for Play 2.9+ and use JDK 8 for older versions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Support for Play 2.9/3.0
2 participants