【问题标题】:Recover data from an Angular form with Spring使用 Spring 从 Angular 表单中恢复数据
【发布时间】: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


【解决方案1】:

您的 Form 类是最终的。我认为您使用 Jackson 使用 setter 创建反序列化您的对象表单。由于它是最终的,杰克逊不能使用设置器来设置对象 1 和对象 2。他们是空的

编辑: 不要设置你的 bean 决赛

编辑 2:

在您的 Angular 应用中更新:

.post("/myURL", {data : this.formData})

与:

.post("/myURL", this.formData)

此方法正在等待对象发送。通过放置 {data : this.formData},您可以添加一个具有“数据”属性的超级对象。

【讨论】:

  • 对不起,它也不起作用......我的豆子现在都不是最终的,但结果是一样的。
  • 你用的是哪个版本的spring?您可以将您的 pom.xm 和您的所有课程添加到帖子中吗?
  • 我在2.0.0版本中使用SpringBoot。我使用 gradle 时没有 pom.xml。但我绝对可以发布我的 build.gradle。
  • 好的,是的,请提供您的来源。 SpringBoot 2.0 使用 Jackson,你可以用这个单元测试来测试序列化/反序列化:docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/…
  • 非常感谢!
【解决方案2】:

托马斯是对的。

但另一种方法可能是使用 Gson 序列化。

@RequestBody String 字符串

在实现中我只是做obj = new Gson().fromJson(string, type);

【讨论】:

  • 它也不起作用。你在某个地方有 Angular、Gson 和 Spring 的工作示例吗?
  • 还是一样的结果?表单类已创建但 Obj1 和 Obj2 为空?
  • 是的,完全一样。
猜你喜欢
  • 2018-09-14
  • 2018-06-03
  • 1970-01-01
  • 2019-11-04
  • 2020-02-13
  • 2012-10-22
  • 2017-05-30
  • 2013-09-18
相关资源
最近更新 更多