【问题标题】:Spring - HttpMessageConversionException using ResponseEntity with Map<String,JSONobject>Spring - HttpMessageConversionException 使用 ResponseEntity 和 Map<String,JSONobject>
【发布时间】:2022-01-04 20:36:00
【问题描述】:

我遇到了一个关于访问 Map 中的 JSONobject 的问题。

基本上我正在尝试在这样的控制器方法中构建 Json 回复:

{
    "item1": {
        "type1": 2,
        "type5": 1
    },
    "item6": {
        "type3": 32,
        "type26": 7,
        "type5": 9
        (being the number of keys inside of each key/value an object with several key/value entries)
    }
}

这是控制器:

@PostMapping(value="/endpoint")
    public ResponseEntity<?> aggData(@RequestBody List<ValidNum> nums){
        try {
            Map<String, JSONObject> data = dataService.aggData(numsData);
            AggSuccess callSuccessResp = new AggSuccess(data);
            return new ResponseEntity<>(callSuccessResp, HttpStatus.OK);
        } catch (Error e) {
            AggError callErrorResp = new AggError(e.getMessage());
            return new ResponseEntity<AggregatedDataError>(callErrorResp, HttpStatus.BAD_REQUEST);
        }
    }

这是服务实现

@Override
    public Map<String,JSONObject> aggregateData(List<ValidNum> numsData) {
        Map<String,JSONObject> aggData = new HashMap<>();

        for (ValidNum vn : numsData) {

            if (aggData.get(vn.item) == null) {
                JSONObject itemTypesCount = new JSONObject();
                aggData.put(vn.item, itemTypesCount.put(vn.type, 1));
            } else {
                JSONObject itemData = aggData.get(vn.item);
                Long typeValue  = (Long) itemData.get(vn.type);
                itemData.put(vn.type, typeValue+1);
                aggData.put(vn.item, itemData);
            }
        }

        return aggData;
    }

ValidNum 类

public class ValidNum {

    public String nr;
    public String item;
    public String type;

    public ValidNumber(String nr, String item, String type) {
        this.nr = nr;
        this.item = item;
        this.type = type;
    }

}

AggSuccess 响应类(我认为问题所在)

public class AggSuccess {
    public Map<String,JSONObject> aggSuccess;

    public AggSuccess(Map<String, JSONObject> aggSuccess) {
        this.aggSuccess = aggSuccess;
    }

}

问题是我总是得到一个错误,除非我将它添加到应用程序属性中:spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false 我不希望这样,因为我不希望数据看起来像这样:

{
    "item1": {},
    "item6": {}
}

评论该条目我收到以下错误:

ERROR 26551 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.json.JSONObject]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.json.JSONObject and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: package.AggDataSuccess["aggSuccess"]->java.util.HashMap["item1"])] with root cause
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.json.JSONObject and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: package.AggDataSuccess["aggSuccess"]->java.util.HashMap["item1"])

最奇怪的是,在控制器的 callSuccessResp 中调试,在将数据发送回邮递员之前,我得到了正确的 json 值:

{
    "item1": {
        "type1": 2,
        "type5": 1
    },
    "item6": {
        "type3": 32,
        "type26": 7,
        "type5": 9
    }
}

那么,我该怎么做才能让响应实体正确读取和序列化 JSON 对象?

【问题讨论】:

    标签: java json spring serialization


    【解决方案1】:

    Jackson 默认不支持org.json 类。尝试使用 Jackson 的 com.fasterxml.jackson.databind.node.ObjectNode 来构建您的 JSON 对象。

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 2023-03-25
      • 2017-10-08
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      相关资源
      最近更新 更多