2014-10-15 1 views
0

열거 처리 (https://github.com/FasterXML/jackson-module-scala/wiki/Enumerations)에서 jackson-module-scala 페이지를 읽었습니다. 아직도 나는 그것을 작동시키지 않을거야. 필수 코드는 다음과 같습니다.jersey/jackson의 스칼라 열거 직렬화가 작동하지 않습니다.

@Path("/v1/admin") 
@Produces(Array(MediaType.APPLICATION_JSON + ";charset=utf-8")) 
@Consumes(Array(MediaType.APPLICATION_JSON + ";charset=utf-8")) 
class RestService { 

    @POST 
    @Path("{type}/abort") 
    def abortUpload(@PathParam("type") typeName: ResourceTypeHolder) { 
    ... 
    } 
} 

object ResourceType extends Enumeration { 
    type ResourceType = Value 
    val ssr, roadsegments, tmc, gab, tne = Value 
} 

class ResourceTypeType extends TypeReference[ResourceType.type] 
case class ResourceTypeHolder(
    @JsonScalaEnumeration(classOf[ResourceTypeType]) 
    resourceType:ResourceType.ResourceType 
) 

이것이 제대로 작동하는 방법입니다. 그럼에도 불구하고 나는 이러한 오류를 얻을 :

Following issues have been detected: 
WARNING: No injection source found for a parameter of type public void no.tull.RestService.abortUpload(no.tull.ResourceTypeHolder) at index 0. 

unavailable 
org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization. 
[[FATAL] No injection source found for a parameter of type public void no.tull.RestService.abortUpload(no.tull.ResourceTypeHolder) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[application/json; charset=utf-8], producedTypes=[application/json; charset=utf-8], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class no.tull.RestService, handlerConstructors=[[email protected]]}, definitionMethod=public void no.tull.RestService.abortUpload(no.tull.ResourceTypeHolder), parameters=[Parameter [type=class no.tull.ResourceTypeHolder, source=type, defaultValue=null]], responseType=void}, nameBindings=[]}'] 
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:467) 
    at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:163) 
    at org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:323) 
    at org.glassfish.jersey.internal.Errors$2.call(Errors.java:289) 
    at org.glassfish.jersey.internal.Errors$2.call(Errors.java:286) 

가 나는 또한 (다른 합병증을 제거하는 동안) 문제를 보여줍니다 그 작은 실행 가능한 프로젝트를 조립했다 : project.tgz

업데이트 : SBT-파일을 생성 gradle이 이상한 구조를 만들고 있는지보십시오. 같은 결과를 얻었으나, 이것은 build.sbt입니다 :

name := "project" 

version := "1.0" 

scalaVersion := "2.10.4" 

val jacksonVersion = "2.4.1" 
val jerseyVersion = "2.13" 

libraryDependencies ++= Seq(
    "com.fasterxml.jackson.core" % "jackson-annotations" % jacksonVersion, 
    "com.fasterxml.jackson.core" % "jackson-databind" % jacksonVersion, 
    "com.fasterxml.jackson.jaxrs" % "jackson-jaxrs-json-provider" % jacksonVersion, 
    "com.fasterxml.jackson.jaxrs" % "jackson-jaxrs-base" % jacksonVersion, 
    "com.fasterxml.jackson.module" % "jackson-module-scala_2.10" % jacksonVersion, 
    "org.glassfish.jersey.containers" % "jersey-container-servlet-core" % jerseyVersion 
) 

seq(webSettings :_*) 

libraryDependencies ++= Seq(
    "org.eclipse.jetty" % "jetty-webapp" % "9.1.0.v20131115" % "container", 
    "org.eclipse.jetty" % "jetty-plus" % "9.1.0.v20131115" % "container" 
) 

... 그리고 이것은 프로젝트/plugins.sbt입니다 :

addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.9.0") 
+0

이 github 문제와 관련 : https://github.com/FasterXML/jackson-module-scala/issues/162 – thoredge

답변

1

당신은 가능성을 갖고있는 것 같다 tarball에 대한 몇 가지 문제점.

스칼라 기능을 사용하려면 일부 스칼라 모듈을 Jackson에 추가해야합니다. 이렇게하면 이렇게 할 수 있습니다 :

val jsonObjectMapper = new ObjectMapper() 
jsonObjectMapper.registerModule(DefaultScalaModule) 
val jsonProvider: JacksonJsonProvider = new JacksonJsonProvider(jsonObjectMapper) 

working jersey-jackson example에 따르면. jersey-media-json-jackson에있는 Jersey에 org.glassfish.jersey.jackson.JacksonFeature을 주입해야합니다. 내 RestApplication.scala

import javax.ws.rs.core.Application 
import javax.ws.rs.ext.{ContextResolver, Provider} 

import com.fasterxml.jackson.databind.ObjectMapper 
import com.fasterxml.jackson.module.scala.DefaultScalaModule 
import com.google.common.collect.ImmutableSet 
import org.glassfish.jersey.jackson.JacksonFeature 

@Provider 
class ObjectMapperProvider extends ContextResolver[ObjectMapper] { 
    val defaultObjectMapper = { 
    val jsonObjectMapper = new ObjectMapper() 
    jsonObjectMapper.registerModule(DefaultScalaModule) 
    jsonObjectMapper 
    } 

    override def getContext(typ: Class[_]): ObjectMapper = { 
    defaultObjectMapper 
    } 
} 

class RestApplication extends Application { 
    override def getSingletons: java.util.Set[AnyRef] = { 
    ImmutableSet.of(
     new RestService, 
     new ObjectMapperProvider, 
     new JacksonFeature 
    ) 
    } 
} 

진짜 문제처럼 온, 그래도 @PathParam 주석이다. 이 코드 경로는 Jackson을 전혀 호출하지 않습니다. 그러나 재미있는 점은 Jersey가 단일 문자열 생성자가있는 모든 유형의 구문 분석을 일반적으로 지원하는 것으로 보입니다. 따라서 ResourceTypeHolder을 수정하면 원하는 기능을 사용할 수 있습니다.

case class ResourceTypeHolder(@JsonScalaEnumeration(classOf[ResourceTypeType]) resourceType:ResourceType.ResourceType) { 
    def this(name: String) = this(ResourceType.withName(name)) 
} 

저널에 주사제 공급 업체로서 열거 형 홀더에 대한 일반적인 지원을 추가 할 수 있습니다. 그러나 그것은 저지를 사용하는 것과 같은 운명을 겪을 프로젝트 인 dropwizard-scala에서 나오지 않았습니다. 따라서 나는 그것이 불가능하거나, 단순히 누군가가 작업을 수행하기에 충분하지 않다는 것을 상상한다. 열거 형에 관해서는, 나는 자바에서 나의 것을 유지하는 경향이있다.

관련 문제