需要帮助实现@RequestBody POJO来封装Map <interface,object =“”>

时间:2019-05-13 23:32:46

标签: java spring-boot jpa

我想在我的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"
    }
  ]
}

0 个答案:

没有答案