JAXBExceptionのためにGET RESTサービスを実装する問題:IllegalAnnotationExceptions

StackOverflow https://stackoverflow.com/questions/3213908

質問

Java RESTサービスを実装する本当に奇妙な問題を抱えています。次のモデルを受け取っています。

@Data @EqualsAndHashCode(callSuper=false, of={"primaryKey"}) 
@Entity @Table(name = "T_UNIQUE_IDENT_TYPE")
@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@XmlRootElement(name="UniqueIdentifierType") @XmlAccessorType(XmlAccessType.FIELD)
public class UniqueIdentifierType extends AbstractEntityWithTime implements Serializable {
    private static final long serialVersionUID = 1L;    
    @Id @Basic(optional = false) @Column(name = "F_TYPE_PK") @XmlTransient
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="S_UNIQUE_IDENT_TYPE") @SequenceGenerator(name="S_UNIQUE_IDENT_TYPE",sequenceName="S_UNIQUE_IDENT_TYPE") 
    private Long primaryKey;
    @Column(name = "F_NAME", nullable=false, length=50)
    private String typeName;
    @Basic(optional = false) @Column(name = "F_CREATION_TIME") @Temporal(TemporalType.TIMESTAMP) @XmlTransient
    private Calendar creationTime;
    @Basic(optional = false) @Column(name = "F_LASTMODIFY_TIME") @Temporal(TemporalType.TIMESTAMP) @XmlTransient
    private Calendar lastModifyTime;
    @JoinColumn(name = "F_UNIT_PK", referencedColumnName = "F_UNIT_PK") @ManyToOne(optional = false) @XmlTransient
    private SoftwareProviderUnit softwareProviderUnit;
}
.

私の取得の既得サービスには、次の署名があります。

@GET 
@Path("/{name}") 
public UniqueIdentifierType get(@PathParam("unitId") final Long unitId, @PathParam("name") final String name) throws WebApplicationException {
.

このGet Serviceで電話をかけるたびに、

を含む500エラーが表示されます
java.lang.AssertionError: JAXBException occurred : 2 counts of IllegalAnnotationExceptions
.

私は次の2つのエラーに追跡することができました:

javassist.util.proxy.MethodHandler is an interface, and JAXB can't handle interfaces.
    this problem is related to the following location:
        at javassist.util.proxy.MethodHandler
        at private javassist.util.proxy.MethodHandler com.rp.central.model.UniqueIdentifierType_$$_javassist_21.handler
        at com.rp.central.model.UniqueIdentifierType_$$_javassist_21

javassist.util.proxy.MethodHandler does not have a no-arg default constructor.
    this problem is related to the following location:
        at javassist.util.proxy.MethodHandler
        at private javassist.util.proxy.MethodHandler com.rp.central.model.UniqueIdentifierType_$$_javassist_21.handler
        at com.rp.central.model.UniqueIdentifierType_$$_javassist_21
.

奇妙なことは、Getメソッドシグネチャを変更してリストを返す場合、TypeNameフィールドを除いてすべてのフィールドを持つオブジェクトのJSONビューで200取得します。例外がそのフィールドに関連していることをどういうわけか推測しています。

などの明示的なゲッターを追加しようとしました
@XmlElement(name="typeName")
public String getTypeName() {
    return typeName;
}
.

TypeNameを送信するようにするために、これはタイプ名をGETメソッドの「リスト」バージョンに取得しますが、まだ非リスト1に500を返します。奇妙なことは、私がこれとまったく同じように見え、問題なく作品する別のモデルを持っているということです。私は今しばらくの間これに対して頭を叩いていました、あらゆる助けが大いに感謝されるでしょう。

ありがとうございました。

役に立ちましたか?

解決

例外は、Marshalledされているオブジェクトは実際にはJavassist(UniqueIdentifierType)によって拡張されたクラスのインスタンスであり、そのクラスに含まれていないフィールドが含まれているため、JAXBは明らかにcom.rp.central.model.UniqueIdentifierType_$$_javassist_21を監視できます。マーシャルになる。おそらく、EhancementはあなたのORMツールによって行われます。

最も明白な解決策は、オブジェクトのフレッシュコピーを返すことです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top