2

我在 spring3 项目中试验 Scala,当我返回带有 @ResponseBody 的地图时,我没有得到我期望的结果。我在 java 中包含了一个工作示例以及我在 scala 中的尝试

// This is Java
@RequestMapping(value="/pbx.admin", method=RequestMethod.GET)
public @ResponseBody Map<String, Object> getInfo2(HttpServletRequest request, Model model){
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("pbx", "admin");
    map.put("method", "s");
    return map;
}

java 返回 json 并定义了 pbx & 方法,这是我所期望的。

// This is Scala
@RequestMapping(value= Array("/pbx.admin"), 
  method=Array(RequestMethod.GET))
@ResponseBody
def getInfo2() = {
  Map("pbx" -> "admin", "method" -> "s")
}

scala返回一些不同的东西:

{
    empty: false,
    traversableAgain: true
}

为了获得我的地图键/值,我需要做什么?

为了获得额外的荣誉,有没有更好的“scala 方式”来做到这一点?谢谢!

4

3 回答 3

8

Spring MVC 框架不是用 Scala 构建的,它不识别 Scala 的Map. 您必须转换scala.collection.Mapjava.util.Map. 您可以使用隐式转换:

import collection.JavaConversions._

def getInfo2(): java.util.Map[String, String] = {
  Map("pbx" -> "admin", "method" -> "s")
}

或手动转换:

import collection.JavaConverters._

def getInfo2() = {
  Map("pbx" -> "admin", "method" -> "s").asJava
}

注意进口,它们很重要。

我怀疑 Spring 可以被黑客入侵以接受 Scala 集合,但显然不是开箱即用的。

于 2012-08-24T16:39:04.950 回答
7

Spring MVC 使用 Jackson。您需要将 Jackson scala 模块注册为映射器。这增加了对杰克逊的 scala 支持,使其能够识别集合。

例子:



    import com.fasterxml.jackson.databind.ObjectMapper
    import com.fasterxml.jackson.module.scala.ScalaModule
    import com.fasterxml.jackson.module.scala.DefaultScalaModule  
    class ScalaObjectMapper extends ObjectMapper  {
        {
            registerModule(DefaultScalaModule)
        }
    }


然后你需要将它添加到你的消息转换器



    <mvc:annotation-driven>
            <mvc:message-converters>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="objectMapper">
                    <bean class="com.petzfactor.packwall.web.module.ScalaObjectMapper"></bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>


该模块位于https://github.com/FasterXML/jackson-module-scala的 github 上

于 2013-10-21T07:26:19.997 回答
0

Scala 模块需要序列化 ​​scala 对象,例如 Collections、Option 和 case 类。这是一种仅通过修改 Spring 上下文来注册 Jackson Scala 模块的方法。

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="objectMapperWithScala"/>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
<bean name="scalaModule" class="com.fasterxml.jackson.module.scala.DefaultScalaModule"/>
<bean name="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"/>
<bean name="objectMapperWithScala" factory-bean="objectMapper" factory-method="registerModule">
    <constructor-arg ref="scalaModule"/>
</bean>
于 2016-01-07T23:08:31.620 回答