복붙노트

[SPRING] Spring POST는 null 값을 가진 객체를받습니다.

SPRING

Spring POST는 null 값을 가진 객체를받습니다.

JSON을 Tomcat 서버에 올바르게 보내는 것처럼 보이는 AngularJS 웹 응용 프로그램이 있지만 서버가 null 값을받습니다. 내 속성 이름이 이미 소문자이기 때문에이 질문은 도움이되지 않았으며 @RequestBody 표기법을 이미 가지고 있기 때문에이 질문은 도움이되지 않았습니다. 편집 : 의견에서 지적했듯이 실제로이 표기법이 없습니다. 나는 그것을 잘못 읽고 있었다.

해당 서버 방법은 다음과 같습니다.

@PostMapping(path="/kind/add")
public @ResponseBody String addNewKind(Kind kind) throws Exception {
    if (kind.getName() == null) {
        throw new Exception("Name not found.");
    }
    kindRepository.save(kind);
    return "Saved";
}

받을 것으로 예상되는 Kind 객체는 다음과 같습니다.

@Entity
public class Kind {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    private String name;
    @OneToMany(mappedBy="kind")
    private Set<Card> cards;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Card> getCards() {
        return cards;
    }

    public void setCards(Set<Card> cards) {
        this.cards = cards;
    }
}

요청하는 방법은 다음과 같습니다.

var uri = 'http://localhost:8080/catalog/api/kind/';

function create(name) {
    var deferred = $q.defer();
    var data = {
        'name': name
    };
    $http({
        method: 'POST',
        url: uri + 'add',
        data: angular.toJson(data),
        headers: {
            'Content-Type': 'application/json; charset=UTF-8'
        }
    }).then(function(response) {
        deferred.resolve(response.data);
    }).catch(function(error) {
        console.error('Error while adding kind');
        deferred.reject(error);
    });
    return deferred.promise;
}

이것은 서버로 전송 된 JSON입니다.

{"name":"Something"}

N.B. id가 자동 생성되고 카드가 비어 있기 때문에 id 또는 cards 매개 변수를 보내지 않고도 도망 갈 수 있다고 가정했습니다. 그러나 다음 JSON을 보낼 때 동일한 null 결과가 나타납니다.

{"id":0,"name":"Something","cards":[]}

요청 헤더는 다음과 같습니다.

Accept:           application/json, text/plain, */*
Accept-Encoding:  gzip, deflate
Accept-Language:  en-US,en;q=0.5
Connection:       keep-alive
Content-Length:   20
Content-Type:     application/json; charset=UTF-8
Cookie:            __distillery=08c4ef1_752470a4-…ID=lr9remoqoi0ht13v1urq5lq8r7
Host:             localhost:8080
Referer:          http://localhost:8080/catalog/
User-Agent:       Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/57.0

그리고 이것은 디버그 모드에서 kind 객체 인수를 볼 때 서버가받는 것입니다.

kind= Kind
    cards= null
    id= 0
    name= null

해결법

  1. ==============================

    1.메소드에 @RequestBody 어노테이션을 사용해야합니다. 컨트롤러는 본문이 무엇인지 알지 못하므로 게시 된 개체가 메서드의 Kind 매개 변수에 바인딩되지 않거나 "만들지"않습니다.

    메소드에 @RequestBody 어노테이션을 사용해야합니다. 컨트롤러는 본문이 무엇인지 알지 못하므로 게시 된 개체가 메서드의 Kind 매개 변수에 바인딩되지 않거나 "만들지"않습니다.

    @PostMapping(path="/kind/add")
    public String addNewKind(@RequestBody Kind kind) throws Exception {
        if (kind.getName() == null) {
            throw new Exception("Name not found.");
        }
        kindRepository.save(kind);
        return "Saved";
    }
    

    새로운 '종류'가 반환 될 것으로 예상되는 경우 컨트롤러 방법을 다음과 같이 표시하려고합니다.

    @PostMapping(path="/kind/add")
    public Kind addNewKind(@RequestBody Kind kind) throws Exception {
        if (kind.getName() == null) {
            throw new Exception("Name not found.");
        }
        return kindRepository.save(kind);
    }
    

    참고로 JSON을 작성할 때 작은 따옴표를 사용하고 있습니다. angular.toJson ()을 사용하여 데이터를 변환하고 있으므로 확인해야합니다. JSON 문자열을 직접 보내서 상호 작용하려는 경우 일반적으로 작동하지 않습니다. JSON은 작은 따옴표를 사용하지 않습니다.

  2. from https://stackoverflow.com/questions/47618559/spring-post-receives-object-with-null-values by cc-by-sa and MIT license