【问题标题】:Unable to pass Array from Angular 2 typescript to Spring Java无法将数组从 Angular 2 typescript 传递到 Spring Java
【发布时间】:2020-02-05 08:58:52
【问题描述】:

我正在尝试从我的打字稿中传递一个字符串数组

tmp : Array<string> = [];

所以我有一个函数将这个数组作为参数输入

passValues(test : Array<string>) {
   ........
   // some method to call post method from service
}

所以在服务中

public passingOfValues( test : Array<string> ) : Observable<Array<string>> {
    let headers = new Headers({ 'Content-Type': 'application/json'} );
    let options = new RequestOptions({ headers: headers); 

    let response = this.http.post(this.basePath + this.modulePath + '/getArrayValue', {'test' : test }, options)
            .map(this.extractData)
            .catch(this.handleError);
            return response;
}

但我收到诸如系统属性 [org.owasp.esapi.devteam] 未设置之类的错误

我在其他帖子上读到,我必须在传递到后端之前对数组进行字符串化。

我需要字符串化有什么原因/我也可以只传递原始数组吗?

编辑 1: 包括后端控制器代码

public ResponseEntity<?> getArrayValues( ArrayList<String> test ) {
     logger.debug("@@@ Test if array has a size @@@" + test.size());


}

显然 size 已经从这里显示为 0。

编辑 2:

调试的时候发现后面的SQL在接收 说

HOME CHARACTER(20 OCTETS)

这有什么不同吗? 就像将字符串传递到八位位组一样,还是我必须进行一些转换?

对不起,如果我有很多问题,我也在努力调试和了解更多信息!

【问题讨论】:

  • 您能否更新一下如何在后端获取数据?
  • 完成!信息够了吗?
  • 感谢@DaveyDaveDave 的迅速行动!真的很感激

标签: java angular typescript spring-boot


【解决方案1】:

大多数开发人员喜欢 JSON 数据作为请求,这在 RESTful api 中是一种很好的做法。为什么?

JSON 格式为{key1: value1, key2: value 2,....}

你已经过去了

this.http.post(this.basePath + this.modulePath + '/getArrayValue',{'test' : YOUR_ACTUAL_ARRAY})

形成前端。 httpClient.post(url,body,options?)urlbody 是强制性的。你怎么能在后端得到它?因为你只有身体,

    public ResponseEntity<?> getArrayValues(@RequestBody List<String> test) {    
       // codes
    }

前端test传递参数的key和变量which 在后端侦听应该同名。否则 @RequestBody("KEY_NAME") List&lt;String&gt; any_variable

正如您在评论中询问的那样,您可能有两个键值对。例如:{ "test" : value1, "tmp": value2}。假设value1value2 都是字符串数组。

this.http.post(this.basePath + this.modulePath + '/getArrayValue',{'myJson' : YOUR_JSON})

有很多方法(例如:Gson、ObjectMapper 等)。我用另一种方式。

创建一个名为 TestTmpConverter 的类

class TestTmpConverter{
    List<String> test;
    List<String> tmp;

    //No-argument constructors & Argument constructors
    //Getters
}

在控制器中

public ResponseEntity<?> getArrayValues(@RequestBody List<TestTmpConverter> myJson ) {
    List<TestTmpConverter> test=myJson.getTest();
    List<TestTmpConverter> tmp=myJson.getTmp();

    // Do your work

}

我只展示了一种方法。有很多方法可以将数据传递到后端,例如@RequestParam, @PathVariable etc。我觉得现在你知道了如何传递数据。

【讨论】:

  • 嘿 varman 这对我来说是新的!但是很好的解释我需要这个,一件事,从你的方法中,你传入一个json对象是否正确?如果是这种情况,我在哪里以及如何在 ts 文件中声明这个 json 对象?
  • 方法有很多。你可以let x={key1:value1,key2:value2} 喜欢硬编码。或者用属性定义一个类/接口。然后将值设置为自动作为 json 对象的属性
  • 抱歉@varman 回复晚了,你的评论让我意识到我缺乏多少知识!我一定会对此进行更多研究。谢谢!虽然我使用了不同的方法来解决我的代码,但你的评论确实帮助我理解了一些东西
  • 很高兴,如果您需要任何帮助,请向我挥手,正如我和您所说,有很多方法可以解决所有问题。快乐编码
【解决方案2】:

对于您的客户,将您的数据直接放在 POST 的正文中:

public passingOfValues( test : Array<string> ) : Observable<Array<string>> {
    let headers = new Headers({ 'Content-Type': 'application/json'} );
    let options = new RequestOptions({ headers: headers); 

    let response = this.http.post(this.basePath + this.modulePath + '/getArrayValue',
                  test, options)
            .map(this.extractData)
            .catch(this.handleError);
            return response;
}

在您的 REST 服务上使用 @RequestBody 注释:

public ResponseEntity<?> getArrayValues(@RequestBody String[] test ) {
     logger.debug("@@@ Test if array has a size @@@" + test.size());


}

【讨论】:

  • 我可以知道将它直接放在花括号 { } 中的区别吗?
  • 格式会有所不同:没有{},您将发布[value1, value2, value3],有它们,{"test": [value1, value2, value3]}
  • @mbojko 我一定会测试你的建议!另一个快速的问题是,如果我的函数接受两个值怎么办?最初我做了 { "test" : test, "tmp": tmp} 另外,在这种情况下,如果 test 是一个字符串,它将变成 { "test": value} ?如果我没有花括号就这样做,它将只是价值
  • @RequestBody String[] test 是可能的。对于上述问题,我们只能在 post 方法中传递一个主体。因此,如果我们将这两个变量都定义为 JSON 格式,我们可以轻松地将 json fromat 转换为您定义的 test 和 tmp 两个值。可以与 post 方法一起作为参数传递的另一种方法
  • @OpkkoLim using [] 表示您直接传递数组。 {} 表示您正在传递一个对象(在您的情况下,对象内部有数组)。
猜你喜欢
  • 2019-05-26
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
相关资源
最近更新 更多