2

spring3プロジェクトでScalaを試していますが、@ResponseBodyでマップを返すと期待どおりの結果が得られません。私はscalaでの試みと一緒にjavaでの実用的な例を含めています

// 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は、pbx&メソッドが定義されたjsonを返します。これは、私が期待していることです。

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

しかし、スカラは別の何かを返します:

{
    empty: false,
    traversableAgain: true
}

マップキー/値を取得するには何をする必要がありますか?

そして、追加のクレジットとして、これを行うためのより良い「scala方法」はありますか?ありがとう!

4

3 に答える 3

8

Spring MVCフレームワークはScalaを念頭に置いて構築されておらず、Scalaを認識しませんMapscala.collection.Mapに変換する必要がありjava.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

SpringMVCはJacksonを使用します。Jacksonscalaモジュールをマッパーとして登録する必要があります。これにより、Jacksonに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モジュールが必要です。Springコンテキストを変更するだけでJacksonScalaモジュールを登録する方法は次のとおりです。

<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 に答える