Scala.Option 的 Spring RequestParam 格式化程序

2023-12-07

我们在 Scala 应用程序中使用 Spring MVC,我想弄清楚如何打开 ScalaOption这样它们就可以使用正确转换@RequestParam。我认为解决方案可能与格式化程序 SPI,但我不确定如何让它很好地工作Option可以包含任意数量的值(我希望 Spring 能够正常处理,就好像转换后的值不是Option根本没有)。本质上,我几乎想应用一个额外的值转换为Option正常转换发生后包装。

例如,给出以下代码:

@RequestMapping(method = Array(GET), value = Array("/test"))
def test(@RequestParam("foo") foo: Option[String]): String

The url /test应该导致foo参数得到的值为None,而网址/test?foo=bar应该导致foo参数得到的值为Some("bar") (/test?foo可能会导致空字符串,或者None).


我们设法通过创建一个来解决这个问题AnyRef to Option[AnyRef]转换器并将其添加到 Spring MVC 中ConversionService:

import org.springframework.beans.factory.annotation.{Autowired, Qualifier}
import org.springframework.core.convert.converter.ConditionalGenericConverter
import org.springframework.core.convert.converter.GenericConverter.ConvertiblePair
import org.springframework.core.convert.{ConversionService, TypeDescriptor}
import org.springframework.stereotype.Component

import scala.collection.convert.WrapAsJava

/**
 * Base functionality for option conversion.
 */
trait OptionConverter extends ConditionalGenericConverter with WrapAsJava {
  @Autowired
  @Qualifier("mvcConversionService")
  var conversionService: ConversionService = _
}

/**
 * Converts `AnyRef` to `Option[AnyRef]`.
 * See implemented methods for descriptions.
 */
@Component
class AnyRefToOptionConverter extends OptionConverter {
  override def convert(source: Any, sourceType: TypeDescriptor, targetType: TypeDescriptor): AnyRef = {
    Option(source).map(s => conversionService.convert(s, sourceType, new Conversions.GenericTypeDescriptor(targetType)))
  }

  override def getConvertibleTypes: java.util.Set[ConvertiblePair] = Set(
    new ConvertiblePair(classOf[AnyRef], classOf[Option[_]])
  )

  override def matches(sourceType: TypeDescriptor, targetType: TypeDescriptor): Boolean = {
    Option(targetType.getResolvableType).forall(resolvableType =>
      conversionService.canConvert(sourceType, new Conversions.GenericTypeDescriptor(targetType))
    )
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala.Option 的 Spring RequestParam 格式化程序 的相关文章

随机推荐

  • Swift 中的“advancedBy”不可用

    我不确定如何解决上述错误消息 我尝试将其转换为索引 但它似乎不接受字符串 我不知道如何advancedBy也有效 非常感谢帮助 在斯威夫特 3 中 advancedBy 已更名为advanced by Int 此外 substringWit
  • 会话超时后自动重定向到登录

    我试图在会话超时后自动重定向到我的登录页面 我尝试在我的 Main Master 页面中添加此代码 所有其他页面都连接到此母版页 protected void Page Load object sender EventArgs e Redi
  • WCF中服务应用的架构

    我需要一些有关 WCF 应用程序架构的帮助 这将是许多应该可用于服务许多不同客户的服务 例如 ASP Net 应用程序 JavaScript 和 或 Silverlight iPhone 视窗手机 Android 有些服务需要身份验证 有些
  • 总结为每组赋予相同的值

    使用代码获取每个物种的平均花瓣长度 group sp lt group by iris iris Species mean plength lt summarise group sp mean iris Petal Length mean
  • Spring MVC Java 配置

    我想从 Spring Web 应用程序设置一个简单的响应主体 我的问题很简单 就是出现网络错误 我的 POM xml 是
  • SQL Server 数据库项目构建期间使用错误的编译器

    我在使用 Visual Studio 2015 编译 SSDT SQL Server 数据库项目时遇到问题 我想在我的数据库项目中使用 C 6 功能 但它似乎不受支持 例如 我在我的数据库项目中添加了下一个类 namespace Datab
  • JSR303 复合注释

    我创建了一个由 Digits 和 Min 组成的复合注释 Digits integer 12 fraction 0 Min value 0 ReportAsSingleViolation Documented Retention Reten
  • 在 AS3 中设置属性是否会阻止时间线补间?

    如果我有一个分配有类的影片剪辑 并且我在代码中更改了该影片剪辑的属性 则该属性似乎无法再在时间轴上进行补间 例如 如果我的类设置 this x 100 并且稍后在时间轴上补间对象的位置 则不会发生该时间轴补间 更改scaleX或scaleY
  • 将 DateTime 分组为 5、15、30 和 60 分钟间隔

    我尝试将一些记录分组为 5 分钟 15 分钟 30 分钟和 60 分钟间隔 SELECT AVG value as AvgValue sample date 5 60 as TimeFive FROM DATA WHERE id 123 A
  • ConfBridge:当管理员用户退出时结束会议

    这几天我在做一些关于ConfBridge的事情 当管理员用户退出时 我使用 confbridge kick all 结束会议 但会议中的其他人会听到 您已被踢出此会议 这不是结束会议的好方法 是否有任何配置或命令可以设置会议在管理员用户退出
  • javascript 中有没有一种好方法可以从 javascript 对象(而不是数组)中删除 Falsy 值?

    在 JavaScript 中 您可以使用很好的 filter 方法从数组中删除 null 或 false 值 到目前为止 我还没有找到从 JavaScript 对象中删除相同内容的方法 为什么会这样呢 目前 您可以为数组创建一个函数 例如
  • 管理 FCM 设备组

    我试图弄清楚如何使用 REST API 从应用程序服务器管理 FCM 设备组 AFAIK 这些是更新的文档 https firebase google com docs cloud messaging android device grou
  • jQuery:如何创建元素然后将其包装在另一个现有元素周围?

    所以我知道如何使用 wrap wrapInner and wrapAll但我想知道如何将 jQuery 1 4 中引入的快速创建语法和包装函数一起使用 基本上我希望能够使用 var targetUl this would be popula
  • 阻止谷歌翻译翻译日期选择器

    http jsfiddle net tkRaQ 51 这里的 addClass datepicker datepicker addClass notranslate 没有修复它 谷歌翻译停止工作日期的选择 由于某种原因 其他代码修复了它 f
  • 没有窗口的 Windows 应用程序中的窗口消息

    我有一个应用程序想要在后台运行 没有可见的窗口或控制台 为了实现这一点 我创建了一个 Windows 应用程序 但不创建窗口 当请求关闭时 即当用户注销时 应用程序需要进行一些清理 如何确定何时关闭 我可以简单地创建一个处理 WM CLOS
  • JS,数组矩阵和forEach行为的区别

    我正在为我的 JS 课程做一些培训任务 我得到一个必须实现一个函数的函数 该函数接受正整数 n 并返回如下所示的矩阵 已传递 5 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 我能够使用
  • 为 Fortran 数组操作指定冒号

    Fortran 允许更轻松地使用数组操作 例如 double precision a 3 3 b 3 3 c 3 3 Given a and b已初始化 我知道一个简单的c a b将导致矩阵加法 使用同样可以实现c a b 我知道第二种方法
  • 前端 Ajax 和 WordPress - 数据库未更新

    所以我正在开发一个 WordPress 网站 我在获取用户输入来更新数据库方面遇到了一些困难 JS var ID this attr id var name name input ID val var createDate created
  • 如何显示进度条?

    我创建了一个隐写术 隐藏位图中的文本 应用程序 我想添加一个进度条来显示该过程的运行时间 procedure TForm1 Button2Click Sender TObject var x y i currentBit bitInChar
  • Scala.Option 的 Spring RequestParam 格式化程序

    我们在 Scala 应用程序中使用 Spring MVC 我想弄清楚如何打开 ScalaOption这样它们就可以使用正确转换 RequestParam 我认为解决方案可能与格式化程序 SPI 但我不确定如何让它很好地工作Option可以包