복붙노트

[SPRING] Scala.Option을위한 Spring RequestParam 포매터

SPRING

Scala.Option을위한 Spring RequestParam 포매터

우리는 스칼라 어플리케이션에서 Spring MVC를 사용하고 있으며 @RequestParam을 사용하여 스칼라 옵션을 적절하게 변환 할 수 있도록 스칼라 옵션의 unwrap 방법을 알고 싶습니다. 나는이 솔루션이 Formatter SPI와 관련이있을 것이라고 생각하지만 Option의 값을 여러 개 가질 수 있다는 점을 감안할 때 이것이 잘 작동하도록하는 방법을 확신 할 수 없다. (스프링이 정상적으로 처리되기를 바란다. 변환 된 값 전혀 옵션이 아니었다). 본질적으로, 나는 평상시의 변환이 끝나면 Option wrapped가되는 값의 추가 변환을 거의 적용하고 싶다.

예를 들어, 다음 코드가 주어집니다 :

@RequestMapping(method = Array(GET), value = Array("/test"))
def test(@RequestParam("foo") foo: Option[String]): String

url / test? foo = bar는 foo 매개 변수의 값이 Some ( "bar")가되어야 함을 의미하는 반면, url / test는 foo 매개 변수의 값을 None으로 지정해야합니다 (/ test? foo는 빈 문자열 또는 없음).

해결법

  1. ==============================

    1.우리는 AnyRef to Option [AnyRef] 변환기를 생성하고 이것을 Spring MVC의 ConversionService에 추가함으로써 이것을 해결할 수 있었다.

    우리는 AnyRef to Option [AnyRef] 변환기를 생성하고 이것을 Spring MVC의 ConversionService에 추가함으로써 이것을 해결할 수 있었다.

    import org.springframework.beans.factory.annotation.{Autowired, Qualifier}
    import org.springframework.core.convert.converter.ConditionalGenericConverter
    import org.springframework.core.convert.converter.GenericConverter.ConvertiblePair
    import org.springframework.core.convert.{ConversionService, TypeDescriptor}
    import org.springframework.stereotype.Component
    
    import scala.collection.convert.WrapAsJava
    
    /**
     * Base functionality for option conversion.
     */
    trait OptionConverter extends ConditionalGenericConverter with WrapAsJava {
      @Autowired
      @Qualifier("mvcConversionService")
      var conversionService: ConversionService = _
    }
    
    /**
     * Converts `AnyRef` to `Option[AnyRef]`.
     * See implemented methods for descriptions.
     */
    @Component
    class AnyRefToOptionConverter extends OptionConverter {
      override def convert(source: Any, sourceType: TypeDescriptor, targetType: TypeDescriptor): AnyRef = {
        Option(source).map(s => conversionService.convert(s, sourceType, new Conversions.GenericTypeDescriptor(targetType)))
      }
    
      override def getConvertibleTypes: java.util.Set[ConvertiblePair] = Set(
        new ConvertiblePair(classOf[AnyRef], classOf[Option[_]])
      )
    
      override def matches(sourceType: TypeDescriptor, targetType: TypeDescriptor): Boolean = {
        Option(targetType.getResolvableType).forall(resolvableType =>
          conversionService.canConvert(sourceType, new Conversions.GenericTypeDescriptor(targetType))
        )
      }
    }
    
  2. from https://stackoverflow.com/questions/33771485/spring-requestparam-formatter-for-scala-option by cc-by-sa and MIT license