【问题标题】:Spring NumberFormatException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.LongSpring NumberFormatException:无法将“java.lang.String”类型的值转换为所需的“java.lang.Long”类型
【发布时间】:2015-09-20 12:32:48
【问题描述】:

我不确定我是否遗漏了一些非常基本的东西,但这是我想做的。

我想对这个地址进行一个 REST API 调用:

https://localhost:8080/fetchlocation?lat=-26.2041028&lng=28.0473051&radius=500

我的休息方法是:

public void fetchlocation(@RequestParam Long lat, @RequestParam Long lng, @RequestParam int radius){ //fetches location}

我收到此错误:

“时间戳”:1442751996949,“状态”:400,“错误”:“错误请求”, “异常”:“org.springframework.beans.TypeMismatchException”,
"message": "无法将 'java.lang.String' 类型的值转换为 所需类型“java.lang.Long”;嵌套异常是 java.lang.NumberFormatException:对于输入字符串:\"-26.2041028\"",
"路径": "/fetchlocation"

我猜这是因为当我进行 GET 调用时,rest API 将坐标作为字符串而不是 Longs 接收。如何确保调用时其余 API 获取的是 Longs 而不是 String 值?

当我更改其余 API 方法以将字符串作为参数时,我可以轻松地使该方法工作,但对于类型检查,我更喜欢使用 Longs。

public void fetchlocation(@RequestParam String lat, @RequestParam String lng, @RequestParam String radius){ //fetches location}

【问题讨论】:

  • 数字不是 Long 而是 Float/Double。由于浮点数无法转换为 Long(从最初收到的字符串)
  • 我想您可能想使用 Double 之类的东西作为坐标值。否则,您的位置将失去 很多 的精度。 (如果您成功地将坐标四舍五入到最接近的整数,那么每个方向的误差范围将约为 +/- 35 英里。)

标签: java spring rest spring-mvc


【解决方案1】:

您尝试转换为java.lang.Long 的数字是-26.2041028

您的号码包含.(十进制)。 Longs 不允许这样做。您需要使用java.lang.Double

并且还可以使用L 代替LongD 代替Double 以用于静态初始化。即使不是必需的,它也使代码更具可读性。

例如,-26.2041028D 代表 Double

【讨论】:

  • 谢谢 - 现在正在运行,不敢相信我错过了。一旦我把它加倍,其余的 api 调用就起作用了。谢谢!
  • 大声笑,我从未使用过任何框架。但我有两年以来编写核心 Java 代码的经验。我想给所有框架用户的 1 个提示,每当你遇到一个让你非常生气的错误时,只要想想你在 bigenner Java 课程中学到的所有基础知识。 :) 快乐编码!
  • D 不是必需的,也不推荐使用。
  • 关于D 的注释在这里毫无意义(尽管我也更喜欢它)——问题代码中的任何地方都有一个静态初始化,唯一的“双”值来自查询参数。
【解决方案2】:

您需要确保要转换为 Long 的字符串包含数字。这意味着例如像这样的字符串 "10d" 不能转换为 Long,因此例外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2019-09-05
    • 2021-03-04
    • 2014-02-01
    • 2017-06-14
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多