You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot REST控制器POST请求返回415 Unsupported Media Type错误排查

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:29:34