将java.lang.Boolean转换为Scala Boolean
我目前正在开发一个Scala应用程序,它利用SpringBoot和Swagger发送和接收REST调用 Swagger和Spring Boot是纯Java项目,与Scala的兼容性有限,但我似乎已经找到了解决这个问题的方法 由于Spring Boot和Swagger将请求作为Java对象处理(需要setter和getter才能工作),因此我必须将请求作为Java对象处理,并将请求转换为以后的对象。这是我所做工作的一个非常简化的版本:将java.lang.Boolean转换为Scala Boolean,java,scala,refactoring,Java,Scala,Refactoring,我目前正在开发一个Scala应用程序,它利用SpringBoot和Swagger发送和接收REST调用 Swagger和Spring Boot是纯Java项目,与Scala的兼容性有限,但我似乎已经找到了解决这个问题的方法 由于Spring Boot和Swagger将请求作为Java对象处理(需要setter和getter才能工作),因此我必须将请求作为Java对象处理,并将请求转换为以后的对象。这是我所做工作的一个非常简化的版本: 输出 测试1=参数(假、真) 测试2=参数(真,真) 测试
输出 测试1=参数(假、真) 测试2=参数(真,真) 测试3=参数(假,假) 测试4=参数(假,假) 测试5=参数(假、真)
好的。。。我的问题是: 有没有一种更简单易读的方法来实现这一点? 我是否每次都必须调用ParamsAsJava.toScala,或者是否有一些awesomeScala方法可以做到这一点
java.lang.blah
ParamsAsJava(java.lang.Boolean.FALSE, java.lang.Boolean.TRUE)
只用
ParamsAsJava(false, true)
相反。自动装箱还没有到任何地方toScala
,请在Params
伴随对象中定义隐式转换:
object Params {
implicit def params_j2s(p: ParamsAsJava): Params = p.toScala()
}
现在你可以写:
val test1: Params = ParamsAsJava(true, false)
当然,如果您不在真空中定义这个变量,而是将它传递给一个方法,那么正确的类型将被自动推断,对象将被隐式转换def toScala()
中使用parens()
,该方法没有副作用java.lang.blah
ParamsAsJava(java.lang.Boolean.FALSE, java.lang.Boolean.TRUE)
只用
ParamsAsJava(false, true)
相反。自动装箱还没有到任何地方toScala
,请在Params
伴随对象中定义隐式转换:
object Params {
implicit def params_j2s(p: ParamsAsJava): Params = p.toScala()
}
现在你可以写:
val test1: Params = ParamsAsJava(true, false)
当然,如果您不在真空中定义这个变量,而是将它传递给一个方法,那么正确的类型将被自动推断,对象将被隐式转换def toScala()
中使用parens()
,该方法没有副作用默认情况下,Spring使用jackson映射器将JSON请求体解码为Java类,并将Java类编码为JSON响应 或者,您可以告诉Spring使用哪个对scala数据类有效
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-scala_2.12</artifactId>
<version>2.9.7</version>
</dependency>
应该是这样,现在您可以使用Spring端点定义中的纯scala数据类。范例
@RestController
@CrossOrigin(origins = Array("*"))
@RequestMapping(value = Array("/"))
class MyController @Autowired()(implicit val jacksonObjectMapper: ObjectMapper) {
import MyController._
@Async
@RequestMapping(value = Array("/talk"), method = Array(RequestMethod.POST), consumes = Array(MediaType.APPLICATION_JSON_VALUE), produces = Array(MediaType.APPLICATION_JSON_VALUE))
def talk(@RequestBody request: MyRequest): MyResponse = {
// goes here
}
}
//expose these in client jar if you want
object MyController {
final case class MyRequest(includeMovies: Boolean, includeTvShows: Boolean, somethingElse: List[String])
final case class MyResponse(whatever: String)
}
默认情况下,Spring使用jackson映射器将JSON请求体解码为Java类,并将Java类编码为JSON响应 或者,您可以告诉Spring使用哪个对scala数据类有效
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-scala_2.12</artifactId>
<version>2.9.7</version>
</dependency>
应该是这样,现在您可以使用Spring端点定义中的纯scala数据类。范例
@RestController
@CrossOrigin(origins = Array("*"))
@RequestMapping(value = Array("/"))
class MyController @Autowired()(implicit val jacksonObjectMapper: ObjectMapper) {
import MyController._
@Async
@RequestMapping(value = Array("/talk"), method = Array(RequestMethod.POST), consumes = Array(MediaType.APPLICATION_JSON_VALUE), produces = Array(MediaType.APPLICATION_JSON_VALUE))
def talk(@RequestBody request: MyRequest): MyResponse = {
// goes here
}
}
//expose these in client jar if you want
object MyController {
final case class MyRequest(includeMovies: Boolean, includeTvShows: Boolean, somethingElse: List[String])
final case class MyResponse(whatever: String)
}
我使用了scala.Boolean和方法。我使用了scala.Boolean和方法。Spring也可以对纯scala数据类进行解码或编码。您只需在
WebMVCConfigureAdapter
中插入支持scala数据类的ScalaObjectMapper
——最受欢迎的答案似乎提供了一个惯用的Spring解决方案,它主要关注Spring,而不是scala。也许这应该反映在标记中?这个挑战不是关于ScalaObjectMapper,也不是关于JacksonObjectMapper,而是关于来自Swagger API的@RequestParam,它不能处理“null”对象(我尝试了Scala选项,但不起作用)。我的问题中提供的解决方案纯粹是一种变通方法,因为我无法在网上找到其他解决方案。我有Java背景,我想知道在Scala中是否有更好的方法来实现这一点,或者是否还有其他一些我还没有发现的魔力。谢谢Spring还可以对纯scala数据类进行解码或编码。您只需在WebMVCConfigureAdapter
中插入支持scala数据类的ScalaObjectMapper
——最受欢迎的答案似乎提供了一个惯用的Spring解决方案,它主要关注Spring,而不是scala。也许这应该反映在标记中?这个挑战不是关于ScalaObjectMapper,也不是关于JacksonObjectMapper,而是关于来自Swagger API的@RequestParam,它不能处理“null”对象(我尝试了Scala选项,但不起作用)。我的问题中提供的解决方案纯粹是一种变通方法,因为我无法在网上找到其他解决方案。我有Java背景,我想知道在Scala中是否有更好的方法来实现这一点,或者是否还有其他一些我还没有发现的魔力。谢谢你好,谢谢你的回复。这不是请求正文,而是请求参数。我需要这样做,因为应用程序需要与其他应用程序兼容(我无法控制)。问题不在杰克逊身上。。jackson工作得很好:-)问题在于Swagger(我必须使用它来记录API)<代码>字段“includeMovies”上的对象“Params”中的字段错误:拒绝值[null];代码[类型不匹配.参数.包含视频]代码>我尝试了不同的方法,似乎我必须将所有的东西都当作Java值来对待,当它们作为请求参数到达时,我看到了。我自己也记得使用java作为请求参数。我会回应一旦我有时间,让我知道这是否有帮助-。你好,谢谢回复。这不是请求正文,而是请求参数。我需要这样做,因为应用程序需要与其他应用程序兼容(我无法控制)。问题不在杰克逊身上。。jackson工作得很好:-)问题在于Swagger(我必须使用它来记录API)<代码>字段“includeMovies”上的对象“Params”中的字段错误:拒绝值[null];代码[类型不匹配.参数.包含视频]代码>我尝试了不同的方法,似乎我必须