Spring rest控制器提供不支持的内容类型

Spring rest控制器提供不支持的内容类型,spring,rest,post,Spring,Rest,Post,大家好,这是我所拥有的: StockController.java @RestController public class StockController { @Autowired private StockRepository repository; @RequestMapping(value = "stockmanagement/stock") public ResponseEntity<?> addStock(@RequestBody St

大家好,这是我所拥有的:

StockController.java

@RestController
public class StockController {

    @Autowired
    private StockRepository repository;

    @RequestMapping(value = "stockmanagement/stock")
    public ResponseEntity<?> addStock(@RequestBody String stock
    ) {

        System.out.println(stock);

        return new ResponseEntity<>(HttpStatus.OK);
    }
原始有效载荷

{"stock": {"productId": 2, "expiryAndQuantity" : {}, "id": 0}}
它可以很好地工作,输出一个json字符串

但是,当我尝试用stock stock替换字符串stock时,stock如下所示:

public class Stock {

    @Id
    private String id;

    private String productId;

    private Map<LocalDateTime, Integer> expiryAndQuantity;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public Map<LocalDateTime, Integer> getExpiryAndQuantity() {
        return expiryAndQuantity;
    }

    public void setExpiryAndQuantity(Map<LocalDateTime, Integer> expiryAndQuantity) {
        this.expiryAndQuantity = expiryAndQuantity;
    }

    @Override
    public String toString() {
        return String.format(
                ""
        );

    }
}
{"productId": 2, "expiryAndQuantity" : {}, "id": 0}

我的问题是,;如何创建映射到我的Stock对象的请求。

您可以尝试使用@JsonRootName注释,默认情况下,Spring序列化不使用root name值。像这样:

public class Stock {

    @Id
    private String id;

    private String productId;

    private Map<LocalDateTime, Integer> expiryAndQuantity;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public Map<LocalDateTime, Integer> getExpiryAndQuantity() {
        return expiryAndQuantity;
    }

    public void setExpiryAndQuantity(Map<LocalDateTime, Integer> expiryAndQuantity) {
        this.expiryAndQuantity = expiryAndQuantity;
    }

    @Override
    public String toString() {
        return String.format(
                ""
        );

    }
}
{"productId": 2, "expiryAndQuantity" : {}, "id": 0}
但是,如果希望序列化具有rootname,则需要使用@JsonRootName注释

@JsonRootName(value = "Stock")
它会产生像这样的东西

{"Stock": {"productId": 2, "expiryAndQuantity" : {}, "id": 0}}
{
   "productId": 2
  ,"expiryAndQuantity" : null
  ,"id": 0
}
你可以在这里看到更多


您可以尝试使用@JsonRootName注释,默认情况下,Spring序列化不使用根名称值。像这样:

public class Stock {

    @Id
    private String id;

    private String productId;

    private Map<LocalDateTime, Integer> expiryAndQuantity;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public Map<LocalDateTime, Integer> getExpiryAndQuantity() {
        return expiryAndQuantity;
    }

    public void setExpiryAndQuantity(Map<LocalDateTime, Integer> expiryAndQuantity) {
        this.expiryAndQuantity = expiryAndQuantity;
    }

    @Override
    public String toString() {
        return String.format(
                ""
        );

    }
}
{"productId": 2, "expiryAndQuantity" : {}, "id": 0}
但是,如果希望序列化具有rootname,则需要使用@JsonRootName注释

@JsonRootName(value = "Stock")
它会产生像这样的东西

{"Stock": {"productId": 2, "expiryAndQuantity" : {}, "id": 0}}
{
   "productId": 2
  ,"expiryAndQuantity" : null
  ,"id": 0
}
你可以在这里看到更多


而不是接受
字符串
接受
股票
对象。从
post
请求接受它,而不是接受
get
请求

@RequestMapping(value = "stockmanagement/stock",method=RequestMethod.POST)
public ResponseEntity<?> addStock(@RequestBody Stock stock){
}
所有参数名都应该等于对象的字段名,因为spring在类路径上有
jackson绑定器
,并且对象将在控制器方法内部创建。如果计划从post请求传递不同的参数,则可以使用

@JsonProperty("pid")
private String productId;

在字段名上。

而不是接受
字符串
接受
股票
对象。并从
post
请求接受它,而不是接受
get
请求

@RequestMapping(value = "stockmanagement/stock",method=RequestMethod.POST)
public ResponseEntity<?> addStock(@RequestBody Stock stock){
}
所有参数名都应该等于对象的字段名,因为spring在类路径上有
jackson绑定器
,并且对象将在控制器方法内部创建。如果计划从post请求传递不同的参数,则可以使用

@JsonProperty("pid")
private String productId;

在字段名上。

这不是为了创建响应json对象,有效负载中的json来自我的请求而不是我的响应,但我认为这对于请求是一样的。这不是为了创建响应json对象,有效负载中的json来自我的请求而不是我的响应,但我认为对于请求也是一样的。