Spring Boot REST控制器POST请求返回415 Unsupported Media Type错误排查
你好!遇到415 Unsupported Media Type错误,通常意味着Spring MVC无法将请求的JSON内容转换为你的Scontrino实体类对象。结合你提供的代码,我们可以从以下几个方面排查问题:
1. 实体类缺少必要的Getter/Setter方法(最可能的原因)
观察你的Scontrino实体类,我发现几个字段缺少对应的Getter/Setter方法:
id字段:只有定义和注解,没有getId()和setId()articoli字段:只有getArticoli(),没有setArticoli()quantita字段:只有getQuantita(),没有setQuantita()
Jackson(Spring Boot默认的JSON处理库)在序列化/反序列化Java对象时,依赖Getter/Setter方法来访问类的属性(或者属性本身是public的,或者使用@JsonProperty注解显式标记)。即使你的请求JSON中没有包含这些字段,实体类缺少必要的访问方法也会导致Spring无法正确实例化Scontrino对象,进而触发415错误。
修复方案:给Scontrino类的所有字段补充Getter/Setter方法:
@Entity public class Scontrino { @Id @GeneratedValue(strategy= GenerationType.IDENTITY) private Long id; private LocalDateTime data; // 补充id的Getter/Setter public Long getId() { return id; } public void setId(Long id) { this.id = id; } // 原有的data的Getter/Setter保留 public LocalDateTime getData() { return data; } public void setData(LocalDateTime data) { this.data = data; } @ManyToMany @JoinTable( name="scontrino_articolo", joinColumns = @JoinColumn(name= "id_scontrino"), inverseJoinColumns = @JoinColumn(name= "id_articolo") ) private Set<Articolo> articoli=new HashSet<>(); // 补充articoli的Setter public void setArticoli(Set<Articolo> articoli) { this.articoli = articoli; } @ElementCollection @JoinTable(name="Quantita_scontrino_articolo", joinColumns=@JoinColumn(name="id_scontrino")) @Column(name="Quantita") @MapKeyJoinColumn(name="id_articolo") private Map<Articolo,Integer> quantita = new HashMap<>(); // 补充quantita的Setter public void setQuantita(Map<Articolo, Integer> quantita) { this.quantita = quantita; } // 原有的其他方法保留 public Set<Articolo> getArticoli() { return articoli; } public Map<Articolo, Integer> getQuantita() { return quantita; } public void addArticolo(Articolo articolo) { ... } public void removeArticolo(Articolo articolo) { ... } @Override public boolean equals(Object o) { ... } @Override public int hashCode() { ... } }
2. 检查关联实体Articolo的配置
虽然你的请求JSON中没有包含与Articolo相关的字段,但Scontrino类中存在@ManyToMany和@ElementCollection关联到Articolo。如果Articolo类不符合Jackson序列化要求(比如缺少无参构造器、必要的Getter/Setter),也可能间接导致Scontrino的反序列化失败。
验证点:确保Articolo类:
- 有无参构造器(JPA和Jackson都需要)
- 所有字段有对应的Getter/Setter方法
- 主键字段配置正确(比如
@Id注解和自增策略)
3. 确认请求的Content-Type和JSON格式
虽然你提到请求的Content-Type是application/json;charset=UTF-8,但还是要再验证:
- 如果你用Postman、Insomnia等工具发送请求,确保在Headers中正确设置了
Content-Type: application/json,不要误设为其他类型(比如text/plain) - 你的请求JSON格式是否正确:
{"data": "2025-01-05T10:30:00"}是符合ISO 8601标准的LocalDateTime格式,Jackson可以直接处理,这部分没问题。
4. 控制器注解的小优化(非错误原因,但建议)
你的控制器方法用了@RequestMapping(value="/crea",method= RequestMethod.POST),可以换成更简洁的@PostMapping("/crea"),这是Spring 4.3+推荐的写法,代码更清晰,功能完全一致:
@RestController @RequestMapping("/scontrini") public class ControllerScontrini { private final ScontrinoService scontrinoService; // 构造注入已经是Spring推荐的方式,这里保持就好 @Autowired public ControllerScontrini(ScontrinoService scontrinoService){ this.scontrinoService=scontrinoService; } @PostMapping("/crea") // 替换原来的@RequestMapping public Scontrino crea(@RequestBody Scontrino scontrino) { return scontrinoService.crea(scontrino); } }
按照上面的步骤修改后,重新启动应用,再发送POST请求,应该就能解决415错误了。如果问题仍然存在,可以补充Articolo类的代码或者请求的详细日志,我再帮你进一步排查~
内容来源于stack exchange

