2016-03-29 7 views
0

Я борюсь с созданием компонента, использующего класс Scala в Scala. Его аргументы конструктора не являются простыми типами, а являются типами Scala Function1. Как я могу его создать?Spring and Scala - Function1 constructor-arg

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

аргументы конструктора этого класса являются:

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 
) 

Это означает, в весеннем фасоли, мне нужно передать конструктору-арг типов:

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> 

Я не очень хорошо - в Scala, поэтому я не уверен, как это сделать. Есть идеи?

ответ

0

Наконец-то разобрался. Я первый должен был добавить SCALA-Util к application.xml:

<?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"> 

я также необходимо создать реализацию Scala признака FUNCTION1 (которая в основном просто интерфейс):

package com.test.util 

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

Теперь, вернувшись в application.xml, я создал необходимый Beans, чтобы соответствовать конструктору арга и создал бобы permissivePolicy ссылки на них:

 <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> 

Это дал мне объект политики с Essent а также пустые конструктор-аргументы правильного типа. Если я хочу заполнить их в какой-то момент, просто нужно либо изменить Function1Impl, либо отредактировать значения в application.xml.