Ошибка синтаксического анализа JSON: невозможно создать экземпляр класса

Невозможно сопоставить строку json с объектом java, получая ошибку Ошибка синтаксического анализа JSON: невозможно создать экземпляр com.test.CPInput$Evc$Uni

ошибка:

{
"timestamp": 1502270576300,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "**JSON parse error: Can not construct instance of com.test.CPInput$Evc$Uni: can only instantiate non-static inner class by using default, no-argument constructor; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.test.CPInput$Evc$Uni: can only instantiate non-static inner class by using default, no-argument constructor at [Source: java.io.PushbackInputStream@edc246; line: 20, column: 9] (through reference chain: com.test.CPInput["evc"]->com.test.CPInput$Evc["uni"]->java.util.ArrayList[0]**)",
"path": "/demo/addCustomer"
}

json

{
  "customerId": "abcdef",
  "customerSegment": {
    "customerType": "customer type",
    "customerSubtype": "subtype",
    "industry": "industry",
    "subIndustry": "subindustry",
    "specialPopulation": " spl population"
  },
  "evc": {
    "evcId": "evcid",
    "action": "PR",
    "serviceId": "assigned prod id",
    "previousValues": {
        "previousName":"evcId",
        "previousValue":"EVC id - OLD"
    },
    "uni": [
      {
        "type": "uniA",
        "uniId": "uni id",
        "siteId": "sidt id",
        "tspCode": "tsp code",
        "elocId": "e loc id",
        "siteClli": "site clli",
        "uniAction": "PR",
        "previousValues": {
            "previousName":"evcId",
            "previousValue":"EVC id - OLD"
        }
      },
      {
        "type": "uniZ",
        "siteId": "sidt id",
        "tspCode": "tsp code",
        "elocId": "e loc id",
        "siteClli": "site clli",
        "uniAction": "PR",
        "previousValues": {
            "previousName":"evcId",
            "previousValue":"EVC id - OLD"
        }
      }
    ]
  },
  "solutionType": "EPL",
  "source": "Orion"
}

CPInput.java

public class CPInput {


    private String customerId;
    private CustomerSegment customerSegment;
    private Evc evc;
    private String solutionType;
    private String source;

    public CPInput() {
        super();
    }

    public class CustomerSegment{
        private String customerType;
        private String customerSubtype;
        private String industry;
        private String subIndustry;
        private String specialPopulation;
        //getter setter

    }

    public class Evc{
        private String evcId;
        private String action;
        private String serviceId;
        private PreviousValues previousValues;
        private List<CPInput.Evc.Uni> uni=new ArrayList<CPInput.Evc.Uni>();
        //getter setter

        public class PreviousValues{
            private String previousName;
            private String previousValue;
            //getter setter

        }


        public class Uni{
            private String type;
            private String uniId;
            private String siteId;
            private String tspCode;
            private String elocId;
            private String siteClli;
            private String uniAction;
            private PreviousValues previousValues;
            //getter setter

            public class PreviousValues{
                private String previousName;
                private String previousValue;
                //getter setter

    }

//getter setter

}

Демоконтроллер.java

@RestController
@SpringBootApplication(scanBasePackages = {"com.test"})
@RequestMapping(value = "/demo")
public class DemoController {

    @RequestMapping(method = RequestMethod.POST, value = "/addCustomer")
    public CPOutput addCustomer(@RequestBody CPInput input) {
        System.out.println(input);      
        return null;
    }

}

person 2787184    schedule 09.08.2017    source источник
comment
Я сделал внутренние классы статическими и решил проблему.   -  person 2787184    schedule 09.08.2017


Ответы (1)


Попробуйте использовать статические внутренние классы для: CustomerSegment, Evc, PreviousValues ​​и Uni.

Я всегда использую статические внутренние классы, и у меня нет таких проблем.

person Rami Sharaiyri    schedule 09.08.2017
comment
И вот некоторое объяснение этой проблемы: cowtowncoder.com/blog/archives /2010/08/entry_411.html - person MicNeo; 18.01.2018
comment
Вызывает ли использование статического класса состояние гонки? - person isgoed; 13.12.2020
comment
Возможно, это то, о чем вы спрашиваете? stackoverflow.com/questions/42407057/ - person Rami Sharaiyri; 14.12.2020