programing

JSON 구문 분석 오류: io.starter.topic 인스턴스를 생성할 수 없습니다.주제

stoneblock 2023. 3. 20. 21:22

JSON 구문 분석 오류: io.starter.topic 인스턴스를 생성할 수 없습니다.주제

Spring Boot를 배우고 있는데 데모를 했는데 POST 했을 때 오브젝트 추가 요청이 안 들어왔어요!

오류 메시지는 다음과 같습니다.

{
    "timestamp": 1516897619316,
    "status": 400,
    "error": "Bad Request",
    "exception": "org.springframework.http.converter.HttpMessageNotReadableException",
    "message": "JSON parse error: Can not construct instance of io.starter.topic.Topic: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of io.starter.topic.Topic: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)\n at [Source: java.io.PushbackInputStream@1ff3f09a; line: 2, column: 9]",
    "path": "/topics/"
}

마이 엔티티:

public class Topic {
    private String id;
    private String name;
    private String author;
    private String desc;

    public Topic(String id, String name, String author, String desc) {

        this.id = id;
        this.name = name;
        this.author = author;
        this.desc = desc;
    }
    //getters and setters

내 컨트롤러:

public class TopicController {

    @Autowired
    private TopicService topicService;


    @RequestMapping(value = "/topics", method = RequestMethod.POST)
    public void addTopic(@RequestBody Topic topic) {
        topicService.addTopic(topic);
    }

서비스:

@Service
public class TopicService {
    private List<Topic> topics = new ArrayList<>(Arrays.asList(
            new Topic("1", "topic1", "Martin", "T1"),
            new Topic("2", "topic2", "Jessie", "T2")  
            ));



    public void addTopic(Topic topic) {

        topics.add(topic);
    }

}

내 아들:

{
    "id": "3",
    "name": "topic3",
    "author": "Jessie3",
    "desc": "T3"
}

도와주세요!

탈직렬화 목적Topic에는 0자리 생성자가 있어야 합니다.

예를 들어 다음과 같습니다.

public class Topic {
    private String id;
    private String name;
    private String author;
    private String desc;

    // for deserialisation
    public Topic() {}    

    public Topic(String id, String name, String author, String desc) {    
        this.id = id;
        this.name = name;
        this.author = author;
        this.desc = desc;
    }

    // getters and setters

}     

이것은 잭슨 라이브러리의 기본 동작입니다.

생성자에 주석을 달아야 합니다.

연관된 클래스의 새 인스턴스를 인스턴스화하는 데 사용할 생성자 및 공장 메서드를 정의하는 데 사용할 수 있는 마커 주석입니다.

참고: 작성자 메서드(컨스트럭터, 공장 메서드)에 주석을 달 때 방법은 다음 중 하나여야 합니다.

  • 인수에 주석을 붙이지 않은 단일 인수 생성자/팩토리 메서드: 이 경우 Jackson은 먼저 JSON을 인수 유형에 바인딩한 다음 생성자를 호출합니다.이것은 (시리얼라이제이션에 사용)과 함께 사용되는 경우가 많습니다.
  • 바인딩할 속성 이름을 나타내기 위해 모든 인수에 또는 를 주석으로 붙이는 컨스트럭터/팩토리 메서드

또한 파라미터 이름을 검출할 수 있는 확장 모듈 중 하나를 사용하지 않는 한 모든 주석에서 실제 이름을 지정해야 합니다('기본값'의 경우 빈 문자열이 아님). 이는 8 이전 버전의 JDK가 바이트 코드에서 파라미터 이름을 저장하거나 가져올 수 없기 때문입니다.그러나 JDK 8(또는 Paranamer와 같은 도우미 라이브러리 또는 Scala나 Kotlin과 같은 다른 JVM 언어를 사용)에서는 이름을 지정하는 것은 옵션입니다.

다음과 같이 합니다.

@JsonCreator
public Topic(@JsonProperty("id") String id, @JsonProperty("name") String name,
             @JsonProperty("author") String author, @JsonProperty("desc") String desc) {
    this.id = id;
    this.name = name;
    this.author = author;
    this.desc = desc;
}

언급URL : https://stackoverflow.com/questions/48448079/json-parse-error-can-not-construct-instance-of-io-starter-topic-topic