我正在构建一个健身追踪器应用程序,它允许用户跟踪他们的锻炼。锻炼由一系列动作组成。抽象的运动类由几个运动子类型扩展。
抽象类:
@XmlSeeAlso({BodyweightMovementDTO.class, CalorieMovementDTO.class,
DistanceMovementDTO.class, WeightedMovementDTO.class})
public abstract class Movement {
public abstract MovementType getType();
public abstract void setType(final MovementType type);
}
扩展:
@XmlRootElement(name = "weightedMovement")
public class WeightedMovementDTO extends Movement {
private MovementType type;
private Integer weight;
private Integer reps;
public WeightedMovementDTO(final MovementType type, final Integer weight, final Integer reps) {
this.type = type;
this.weight = weight;
this.reps = reps;
}
//Getters and Setters
}
并通过以下方式扩展:
@XmlRootElement(name = "distanceMovement")
public class DistanceMovementDTO extends Movement {
private MovementType type;
private Integer distance;
public DistanceMovementDTO(final MovementType type, final Integer distance) {
this.type = type;
this.distance = distance;
}
//Getters and setters
}
还有两个类似的课程。
允许 PUT 锻炼或 WorkoutResultDTO 的资源方法如下:
@PUT
@Path("{user}/today")
@Consumes({ MediaType.APPLICATION_JSON })
public Response recordResult(@PathParam(value = "user") final String user,
final WorkoutResultDTO result) {
WorkoutController.recordResult(user, result);
return Response.ok().build();
}
WorkoutResultDTO 是我认为导致问题的对象,因为它具有抽象运动对象的 ArrayList。
@XmlRootElement(name = "workout")
public class WorkoutResultDTO implements Result {
private int id = 0;
private OcsidDate date = new OcsidDate(LocalDate.now());
private Scale scale = null;
private WorkoutType workoutType = null;
private List<Movement> wod = new ArrayList<>();
private boolean complete = false;
private double time = 0.0;
private int reps = 0;
public WorkoutResultDTO() {}
public WorkoutResultDTO(final int id) {
this.id = id;
}
//Getters and Setters
}
当我使用邮递员对我的端点执行 PUT 时,返回以下错误:
Can not construct instance of ninja.ocsid.crossfit.dto.movement.abstracts.Movement,
problem: abstract types either need to be mapped to concrete types,
have custom deserializer, or be instantiated with
additional type information at [Source:org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@41d13e9b;
line: 16, column: 9] (through reference chain:
ninja.ocsid.crossfit.dto.result.WorkoutResultDTO["movements"])
我被引导相信添加以下行:
@XmlSeeAlso({BodyweightMovementDTO.class, CalorieMovementDTO.class,
DistanceMovementDTO.class, WeightedMovementDTO.class})
将解决此问题,因为该注释将提供有关如何将抽象类反序列化为一种具体类型的足够信息,但情况似乎并非如此。我是否缺少一些其他配置或一些需要执行此操作的自定义类?这两天我一直在尝试解决这个问题,这在谷歌上搜索了很多,但无济于事。欢迎任何意见。谢谢!
编辑:图像中附加的 PUT 请求的详细信息。