Java EclipseLink:缺少类型的指示器字段值的类
我的应用程序在Payara上运行并提供REST API,但当我尝试使用POST请求创建对象时,会出现以下异常:Java EclipseLink:缺少类型的指示器字段值的类,java,rest,jpa,glassfish,eclipselink,Java,Rest,Jpa,Glassfish,Eclipselink,我的应用程序在Payara上运行并提供REST API,但当我尝试使用POST请求创建对象时,会出现以下异常: Exception [EclipseLink-43] (Eclipse Persistence Services - 2.6.0.payara-p1): org.eclipse.persistence.exceptions.DescriptorException Exception Description: Missing class for indicator field value
Exception [EclipseLink-43] (Eclipse Persistence Services - 2.6.0.payara-p1): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class for indicator field value [Miss] of type [class java.lang.String].
Descriptor: XMLDescriptor(at.htl.handballinheritance.entity.Throw --> [DatabaseTable(event), DatabaseTable(dataObject)])
at org.eclipse.persistence.exceptions.DescriptorException.missingClassForIndicatorFieldValue(DescriptorException.java:940)
at org.eclipse.persistence.internal.oxm.QNameInheritancePolicy.classFromRow(QNameInheritancePolicy.java:278)
...
相反,当我在使用Hibernate的Wildfly上执行程序时,一切都很好,没有错误发生
实体:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@XmlRootElement
public abstract class Event extends DataObject implements Serializable {
...
}
@Entity
public class Throw extends Event implements Serializable {
@Enumerated(EnumType.STRING)
@NotNull
private ThrowingType type;
...
}
public enum ThrowingType {
Goal, Miss
}
REST API:
@POST
public Response create(Throw entity) {
em.persist(entity);
return Response.created(URI.create("...")).build();
}
我认为Eclipselink在解组我的json时有问题。是否需要任何其他注释?联接继承在默认情况下将使用“类型”字段来确定要使用的实体类,json/xml封送也是如此。您有一个类型字段,但填充了无法转换为类的“Miss” 有关自定义策略或是否可以更改发布的JSON,请参阅 这里讨论了JPA中的类型字段 这里呢
如果使用名为“type”的字段,则会出现此错误。联合继承在默认情况下将使用“type”字段来确定要使用的实体类,json/xml封送也是如此。您有一个type字段,但填充了无法转换为类的“Miss”。请参阅以了解自定义策略,或者您是否可以更改正在发布的JSON。我将属性重命名为throwingType,从而解决了我的问题。请将您的评论作为答案发布,以便我可以将其标记为答案。是否有任何解释说明为什么EclipseLink失败而Hibernate没有?Hibernate在数据库中使用联接继承时不必考虑类型字段,因为它可以使用查询联接机制。EclipseLink确实使用了该类型,因为它认为过滤掉不需要的连接更有效,并且还必须在不可能进行连接的情况下处理JSON/XML。这实际上是我的问题。。在那里保存了我。那么,如果您想命名您的联合继承(鉴别器)字段
类型
,而不是类型
,gc\u类型
,抛出类型
等,这里的解决方案是什么。?我认为这是一个非常糟糕的软件决策。我不理解你的问题,什么软件决策是糟糕的EclipseLink在需要时使用“TYPE”作为继承的默认字段名(单表继承和联接表继承需要在EclipseLink中使用它)。如果希望它使用其他内容,请指定DiscriminatorColumn注释。这里的问题是,他们无意中将“TYPE”字段用于其他内容,导致值发生冲突。事实上,发生这种情况时,我在项目中更改了一些内容,但现在我无法再复制它了。有一段时间,类型
字段导致了一些异常,我认为这是某种内部命名决定。恐怕,我不能回到发生这件事的时候,我上面的咆哮可能不再适用了。(我不能在此更改我的评论)