admin管理员组文章数量:1314565
I have an AngularJS web application that looks like it is correctly sending JSON to the Tomcat server, but the server receives null values. This question didn't help because my property names are already lowercase, and this question didn't help because I've already got the @RequestBody
notation. Edit: as pointed out in the ments, I don't actually have this notation. I was reading it wrong.
Here is the server method in question:
@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";
}
Here is the Kind object it expects to receive:
@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;
}
}
Here is the method that makes the request:
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;
}
This is the JSON sent to the server:
{"name":"Something"}
N.B. I assumed that I can get away without sending id
or cards
parameters, since id
is auto-generated and cards
can be empty; however, I get the same null results when sending the following JSON:
{"id":0,"name":"Something","cards":[]}
These are the request headers:
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
And this is what the server receives when I view the kind
object argument in debug mode:
kind= Kind
cards= null
id= 0
name= null
I have an AngularJS web application that looks like it is correctly sending JSON to the Tomcat server, but the server receives null values. This question didn't help because my property names are already lowercase, and this question didn't help because I've already got the @RequestBody
notation. Edit: as pointed out in the ments, I don't actually have this notation. I was reading it wrong.
Here is the server method in question:
@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";
}
Here is the Kind object it expects to receive:
@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;
}
}
Here is the method that makes the request:
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;
}
This is the JSON sent to the server:
{"name":"Something"}
N.B. I assumed that I can get away without sending id
or cards
parameters, since id
is auto-generated and cards
can be empty; however, I get the same null results when sending the following JSON:
{"id":0,"name":"Something","cards":[]}
These are the request headers:
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
And this is what the server receives when I view the kind
object argument in debug mode:
kind= Kind
cards= null
id= 0
name= null
Share
Improve this question
edited Dec 4, 2017 at 10:01
catholicposer
asked Dec 3, 2017 at 12:54
catholicposercatholicposer
771 silver badge7 bronze badges
2
-
"..., because I've already got the @RequestBody notation" - Where? I only see the
@ResponseBody
. – helospark Commented Dec 3, 2017 at 15:18 -
@helospark You're right, how embarrassing! I was looking at
@RequestBody
and reading@ResponseBody
. – catholicposer Commented Dec 4, 2017 at 9:59
1 Answer
Reset to default 6You need to use the @RequestBody annotation on your method. Your controller doesn't know what the body is, so your posted object is never bound (or never "makes it") to your method's Kind parameter.
@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";
}
If you are expecting the new 'Kind' to be returned, you'd want your controller method to look like this:
@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);
}
On a side note, I notice you are using single quotes in your JSON when you write it out. Since you are converting data with angular.toJson()
, you should be OK there. If you are trying to interact by sending a JSON string directly, this will generally not work. JSON doesn't use single quotes.
本文标签: javascriptSpring POST receives object with null valuesStack Overflow
版权声明:本文标题:javascript - Spring POST receives object with null values - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741966815a2407595.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论