我想在我的POST请求正文中有一个键为“过滤器”,它是过滤器类型和所选选项的映射。 问题是,我需要一种基本的说法,“好吧,对于此键,使用接口类Filter的此实现,并为其提供选项的属性” 但是,当尝试这样做时,在使用Postman时显示以下错误:“ Unsupported Media Type”“内容类型'application / json; charset = UTF-8'不支持”
问题是,控制器使用其他POJO作为RequestBody以及使用application / json进行响应的其他方法没有问题,但是由于某种原因,该对象没有提供我想要的东西。
我尝试从中获取一些类似问题的资源,并了解我是否可以解决自己的问题。
Persist collection of interface using Hibernate
JPA Map<String,String> mapping
When to use DiscriminatorValue annotation in hibernate
@RestController
public class ScheduleController {
@Autowired
Scheduler bruteForceScheduler;
@PostMapping(path = "/generateSchedules",
consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ScheduleResponse scheduleRequest(@RequestBody ScheduleRequest request) {
ScheduleResponse response = bruteForceScheduler.generate(request);
return response;
}
}
@Entity
public class ScheduleRequest {
@Id
@GeneratedValue
private int id;
@ElementCollection
private List<Course> mandatory;
@ElementCollection
private List<Course> optional;
@ElementCollection
private Map<Filter, String> filters;
// Getters/Setters
}
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "FILTER")
public class ScheduleResponse {
@Id
@GeneratedValue
private int id;
@ElementCollection
private List<Schedule> schedules;
@ElementCollection
@MapKeyColumn (name = "FILTER")
@Column(name = "OPTION")
private Map<Filter, String> filters;
// Getters/Setters
}
public interface Filter<T> extends Serializable {
double getFitness(T o);
}
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractScheduleFilter {
@Id
@GeneratedValue
private int id;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
}
@Entity
@DiscriminatorValue("Time")
public class TimeFilter extends AbstractScheduleFilter implements Filter<Schedule> {...}
因此在Postman中,一般的POST正文应如下所示:
{
"mandatory": [],
"optional": [],
"filters":
{
"Time": "Early"
}
}
这样我可以将“过滤器映射”用作“ filters”键,然后说“哦,“ Time”键用于TimeFilter.java,因此请创建该类的实例并设置“ option”变量表示为“早期”。但是,我只是收到了前面所述的“不受支持的媒体类型”错误。
我探索过的一些替代方法是改用Map并引用属性文件以实例化正确的类,但是就添加更多过滤器而言,每次您都必须编辑属性文件似乎有点不雅想要添加一个新的过滤器。 另外,我在考虑也许只是将Map设为列表或集合,因为这并没有像Map那样给我带来Unsupported Media Type错误,但是我认为这需要额外的对象包装,但这并不是优雅。
改为使用列表的示例:
{
"mandatory": [],
"optional": [],
"filters":
[
{
"type": "Time",
"option": "Early"
}
]
}