Java Spring Boot中415 Unsupported Media Type错误解决
问题原因
你遇到的415错误核心原因是**@JsonBackReference注解被错误地标注在集合类型(List<Question>)上**。Jackson的@JsonBackReference仅支持单个对象的反向引用,无法处理集合类型,这导致反序列化时出现类型不兼容的异常,触发了InvalidDefinitionException。
解决方案
下面提供两种可行的解决方式,既能保留预期的序列化响应,又能修复POST请求的415错误:
方案一:调整@JsonManagedReference与@JsonBackReference的位置
正确的注解配对规则是:
- 在**多对一(ManyToOne)**的关联字段上标注
@JsonBackReference(忽略反向序列化,避免循环) - 在**一对多(OneToMany)**的集合字段上标注
@JsonManagedReference(主动序列化关联集合)
修改后的实体代码:
Question类
public class Question { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String question; private Integer question_order; @ManyToOne @JsonBackReference private QuestionGroup questionGroup; }
QuestionGroup类
public class QuestionGroup { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String group_name; @OneToMany(mappedBy = "questionGroup") @JsonManagedReference private List<Question> questions; }
调整后:
- GET请求序列化时,
QuestionGroup会正常返回包含的questions列表,Question会忽略questionGroup的序列化(避免循环引用) - POST请求反序列化时,Jackson可以正确识别单个
QuestionGroup对象的反向引用,不会再出现类型不兼容错误
方案二:使用@JsonIgnoreProperties替代(更灵活)
如果不想依赖@JsonManagedReference/@JsonBackReference的严格配对,可以用@JsonIgnoreProperties直接指定需要忽略的关联属性,同时支持序列化和反序列化:
Question类
public class Question { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String question; private Integer question_order; @ManyToOne @JsonIgnoreProperties("questions") private QuestionGroup questionGroup; }
QuestionGroup类
public class QuestionGroup { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String group_name; @OneToMany(mappedBy = "questionGroup") @JsonIgnoreProperties("questionGroup") private List<Question> questions; }
这种方式的优势:
- 既避免了循环序列化问题,又能保留
Question中的questionGroup对象(只要请求体中包含该字段,就能正确反序列化) - 对集合类型无限制,适配更复杂的实体关联场景
关于@JsonIdentityInfo的补充
你之前使用@JsonIdentityInfo时出现序列化忽略questionGroup的问题,大概率是注解配置不当(比如未指定正确的标识属性)。但相比之下,上面两种方案更直接匹配你的需求,无需额外配置复杂的标识生成规则。
内容的提问来源于stack exchange,提问作者AntiFalx
相关产品推荐
相关产品推荐

