2016-03-29 19 views
0

Ich ringe mit dem Erstellen einer Bohne mit einem Twitter Scala-Klasse. Seine Konstruktorargumente sind keine einfachen Typen und stattdessen Scala Function1-Typen. Wie kann ich es erstellen?Spring und Scala - Function1 Konstruktor-arg

<bean id="permissivePolicy" class="com.twitter.finagle.http.filter.Cors.Policy"> 
</bean> 

Diese Konstruktor Argument der Klasse ist:

case class Policy(
    allowsOrigin: String => Option[String], 
    allowsMethods: String => Option[Seq[String]], 
    allowsHeaders: Seq[String] => Option[Seq[String]], 
    exposedHeaders: Seq[String] = Nil, 
    supportsCredentials: Boolean = false, 
    maxAge: Option[Duration] = None 
) 

Das heißt, in dem Spring-Bean, ich brauche Konstruktor-args von Arten passieren:

1. allowsOrigin - Function1<String, Option<String>> 
2. allowsMethods - Function1<String, Option<Seq<String>>> 
3. allowsHeaders - Function1<Seq<String>, Option<Seq<String>>> 
4. exposedHeaders - Seq<String> 
5. supportsCredentials - boolean 
6. maxAge - Option<Duration> 

ich nicht gut bin -vergangen in Scala, so bin ich nicht sicher, wie man diese Bohne herstellt. Irgendwelche Ideen?

Antwort

0

Schließlich sortiert dies aus. Ich hatte zuerst das scala-util zum application.xml hinzuzufügen:

<?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:scala-util="http://www.springframework.org/schema/scala/util" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context.xsd 
      http://www.springframework.org/schema/scala/util 
      http://www.springframework.org/schema/scala/util/scala-util.xsd"> 

Ich brauchte auch eine Scala Umsetzung des Function1 Merkmal (die im Grunde nur eine Schnittstelle) zu erstellen:

package com.test.util 

    class Function1Impl extends Function1[String, Option[String]] { 
     override def apply(v1: String): Option[String] = Some("") 
    } 

nun, zurück in application.xml, habe ich die notwendigen Beans den Konstruktor args passen und erstellt die permissivePolicy Bohnen Referenzierung:

 <bean id="scalaOptionBean" class="scala.Some"> 
     <constructor-arg value="" /> 
     </bean> 
     <bean id="function1Bean" class="com.test.util.Function1Impl" /> 
     <scala-util:seq id="scalaSeqBean" /> 

     <bean id="permissivePolicy" class="com.twitter.finagle.http.filter.Cors.Policy"> 
     <constructor-arg ref="function1Bean" /> 
     <constructor-arg ref="function1Bean" /> 
     <constructor-arg ref="function1Bean" /> 
     <constructor-arg ref="scalaSeqBean" /> 
     <constructor-arg type="boolean" value="true" /> 
     <constructor-arg ref="scalaOptionBean" /> 
     </bean> 

     <bean id="httpFilter" 
      class="com.twitter.finagle.http.filter.Cors.HttpFilter"> 
     <constructor-arg ref="permissivePolicy" /> 
     </bean> 

das gab mir ein Richtlinienobjekt mit essent iere leere Konstruktorargumente vom richtigen Typ. Wenn ich sie irgendwann auffüllen möchte, muss ich nur entweder die Funktion1Impl ändern oder die Werte in der Datei application.xml anpassen.