【发布时间】:2017-01-16 14:29:11
【问题描述】:
这几天我遇到了一个问题。我确定这是非常基本的,但我无法找到解决方案。
我尝试使用 Spring 将 Angular 表单发送的数据恢复到 java 方法中。我的代码如下:
App.js
myController.prototype = {
processForm : function processForm() {
alert('foo!');
},
retrieveUrl : function retrieveUrl() {
this.url.$ready = false;
return this.http
.post("/myURL", {data : this.formData})
.then(function(response) {
// do something
}.bind(this), function(error) {
// do something else
}.bind(this));
}
};
formData 的值:
{data :
{"object1":
{"prop1":"q",
"prop2":"w"},
"object2":
{"prop3":"e",
"prop4":"r"}
}
}
还有我的 Java 代码:
@RequestMapping("/myURL")
public void myController(@RequestBody Form form) {
System.out.println(form );
}
我还有三个 bean,Form、Object1 和 Object2,每个都有一个空的构造函数和对应的 getter 和 setter。
今天我在myController中输入,对象形式不为空,但它的两个字段(object1和object2)为空。所以,我猜Spring不明白它需要将数据形式转换成这两个对象。
编辑:
Thomas Pierre > 这是我的 Form bean 的代码
public class Form {
public Object1 object1;
public Object2 object2;
public Form(){}
public Object1 getObject1() {
return object1;
}
public void setObject1(Object1 object1) {
this.object1 = object1;
}
public Object2 getObject2() {
return object2;
}
public void setObject2(Object2 object2) {
this.object2 = object2;
}
@Override
public String toString(){
return "BankForm [debitor = " + debtor +", bank = " + bank + "]";
}
}
我们不能使用Spring注解来自动反序列化吗?
编辑 2: 这是我的 build.gradle 文件:
buildscript {
ext {
springBootVersion = '2.0.0.BUILD-SNAPSHOT'
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
// apply plugin: 'war'
jar {
baseName = 'my-project'
version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
configurations {
providedRuntime
}
bootRun {
// static classpath resources (i.e. in src/main/resources by default) are
// reloadable in the live application
addResources = true
}
dependencies {
compile group: 'com.google.code.gson', name: 'gson', version: '1.7.2'
compile("org.springframework.boot:spring-boot-starter-web") {
exclude module: "spring-boot-starter-tomcat"
}
compile("org.springframework.boot:spring-boot-starter-jetty")
providedRuntime("org.springframework.boot:spring-boot-starter-jetty")
compileOnly('org.projectlombok:lombok')
testCompile("junit:junit")
testCompile('org.springframework.boot:spring-boot-starter-test')
}
Object1.java:
public class Object1 {
public String prop1;
public String prop2;
public Object1(){}
public void setProp1(String prop1) {
this.prop1 = prop1;
}
public String getProp1() {
return prop1;
}
public void setProp2(String prop2) {
this.prop2 = prop2;
}
public String getProp2() {
return prop2;
}
}
Object2.java 完全一样,只是换个数字而已。我检查了两次,Form、Object1 和 Object2 的字段名称与 Angular 返回的 formData 中的名称之间没有输入错误或差异。
我通过重写我在 Java 中恢复的 JSON 犯了一个错误:有一种称为“数据”的“超级对象”,它包含 Object1 和 Object2。这不是问题吗?
【问题讨论】:
-
添加一个 which 控制器方法,它以 JSON 形式返回填充的 Form 实例(从方法中返回实例并将 @ResponseBody 添加到方法中)。您发布的 JSON 格式应与此调用返回的格式相同。
标签: java angularjs spring forms spring-mvc