2014-10-28 6 views
7

Jackson의 @JsonSubTypes 주석을 사용하는 일부 Java 코드를 다형성을 변환하려고합니다.Kotlin에서 Jackson JsonSubTypes annotation을 사용하는 방법

다음
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = Comment.class, name = "CommentNote"), 
    @JsonSubTypes.Type(value = Photo.class, name = "PhotoNote"), 
    @JsonSubTypes.Type(value = Document.class, name = "DocumentNote") 
}) 
public abstract class Note implements Identifiable { 
    [...] 

내가 동등한 것 생각 코 틀린 코드 :

JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
JsonSubTypes(
    JsonSubTypes.Type(value = javaClass<Comment>(), name = "CommentNote"), 
    JsonSubTypes.Type(value = javaClass<Photo>(), name = "PhotoNote"), 
    JsonSubTypes.Type(value = javaClass<Document>(), name = "DocumentNote") 
) 
abstract class Note : Identifiable { 
    [...] 

하지만 세 "JsonSubTypes 각각 다음과 같은 오류를 얻을 여기

는 작업 자바 코드입니다. 유형 "행 :

Kotlin: An annotation parameter must be a compile-time constant 
Kotlin: Annotation class cannot be instantiated 

어떤 아이디어가 있습니까?

답변

6

신고 해 주셔서 감사합니다. 컴파일러에 bug입니다. 이 문제를 해결하려면, 당신은 JsonSubTypes.Type을 가져 자격없이 사용할 수 있습니다 :이 해결되었다고 생각

import org.codehaus.jackson.annotate.JsonSubTypes.Type 

JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
JsonSubTypes(
    Type(value = javaClass<Comment>(), name = "CommentNote"), 
    Type(value = javaClass<Photo>(), name = "PhotoNote"), 
    Type(value = javaClass<Document>(), name = "DocumentNote") 
) 
abstract class Note : Identifiable { 
    [...] 
4

요즘이처럼 쓸 수 있습니다 : 클래스 표기법

import com.fasterxml.jackson.annotation.JsonSubTypes 
import com.fasterxml.jackson.annotation.JsonTypeInfo 

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
    @JsonSubTypes(
     JsonSubTypes.Type(value = Comment::class, name = "CommentNote"), 
     JsonSubTypes.Type(value = Photo::class, name = "PhotoNote"), 
     JsonSubTypes.Type(value = Document::class, name = "DocumentNote")) 
interface Note 

주 JsonSubTypes.Type

+0

죄송합니다. 더 이상 확인할 수 없지만 아직 질문이 있습니다. '.java' 속성 호출이 필요하지 않습니까? 예 :'value = Comment :: class.java' – clemp6r

+1

컴파일러는 불평하지 않습니다. 그것은 .java 속성을 사용할 때 수행됩니다. 이 솔루션은 내 프로젝트에서 작동합니다. –