Spring POST接收具有空值的对象

时间:2017-12-03 12:54:52

标签: javascript java angularjs spring

我有一个AngularJS Web应用程序,看起来它正确地将JSON发送到Tomcat服务器,但服务器接收空值。 This question没有帮助,因为我的媒体资源名称已经是小写,而this question没有帮助,因为我已经获得了@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"}

NB 我认为我可以在不发送idcards参数的情况下离开,因为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 个答案:

答案 0 :(得分:1)

您需要在方法上使用@RequestBody注释。你的控制器不知道正文是什么,所以你发布的对象永远不会绑定(或永远不会#34;使它成为#34;)你的方法的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";
}

如果您期待新的&#39;种类&#39;要退回,您希望您的控制器方法如下所示:

@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不使用单引号。