我有一个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 我认为我可以在不发送id
或cards
参数的情况下离开,因为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
答案 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不使用单引号。