Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将java.lang.Boolean转换为Scala Boolean_Java_Scala_Refactoring - Fatal编程技术网

将java.lang.Boolean转换为Scala Boolean

将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=参数(真,真) 测试

我目前正在开发一个Scala应用程序,它利用SpringBoot和Swagger发送和接收REST调用

Swagger和Spring Boot是纯Java项目,与Scala的兼容性有限,但我似乎已经找到了解决这个问题的方法

由于Spring Boot和Swagger将请求作为Java对象处理(需要setter和getter才能工作),因此我必须将请求作为Java对象处理,并将请求转换为以后的对象。这是我所做工作的一个非常简化的版本:



输出

测试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];代码[类型不匹配.参数.包含视频]我尝试了不同的方法,似乎我必须