2014-06-17 2 views
8

Мне нужен контекст приложения Spring, чтобы включить компонент, который является (Java 7) Path объектом с фиксированным (известным) именем пути. Какое определение XML-компонента нужно использовать?Как создать бит пути

Этот вид фасоли имеет некоторые осложнения:

  • Path представляет собой интерфейс, и Path объекты должны быть созданы с использованием статического фабричного метода Paths.get(String...).
  • Статический заводский метод также имеет перегруженный вариант, Paths.get(URI).

В качестве объекта есть-Path, то class боба должен быть Path:

<bean name="myPath" class="java.nio.file.Path"/> 

Мне нужно, чтобы указать статический фабричный метод для использования, которые, казалось бы, требует factory-method атрибут. Но фабричный метод относится к классу java.nio.file.Paths, а не java.nio.file.Path класса, поэтому я предполагаю следующий не будет работать:

<bean name="myPath" class="java.nio.file.Path" 
    factory-method="java.nio.file.Paths.get"/> 

Наконец, мне нужно дать аргументы для фабричного метода. Как мне это сделать? Использование вложенных элементов constructor-arg (sic)? Итак, что-то вроде этого?

<bean name="myPath" class="java.nio.file.Path" 
    factory-method="java.nio.file.Paths.get"> 
    <constructor-arg value="/my/path/name"/> 
</bean> 

Но это не работает: Пружины бросает BeanCreationException, жалуясь «Ни один метод сопоставления завод не найдено: фабричный метод„java.nio.file.Paths.get()“.»

ответ

7

После нескольких экспериментов с pingw33n's answer, я обнаружил, что это работает:

<bean id="myPath" class="java.nio.file.Paths" factory-method="get"> 
    <constructor-arg value="/my/path" /> 
    <constructor-arg><array /></constructor-arg> 
</bean> 

Примечание:

  • Дайте имя завода, а не объект класс, как значение атрибута class.
  • Дайте дополнительный пустой аргумент конструктора array, чтобы принудительно выбрать правильную перегрузку заводского метода. Это позволяет избежать прохождения кругового маршрута instead constructing a file URI.
-1

Что-то вроде ниже должно помочь.

<bean id="myPath" class="java.nio.file.Paths" factory-method="get"> 
    <constructor-arg type="java.lang.String" value="/my/path/name" /> 
</bean> 
+0

Nope: 'org.springframework.beans.factory.BeanCreationException: Ошибка создания bean с именем 'myPath', определенным в ресурсе пути к ключу [spring.xml]: Не найдено соответствующего метода фабрики: factory bean 'pathFactory'; factory method 'get()' '. – Raedwald

+0

@ Raedwald отредактировал –

-1

Попробуйте это:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="staticMethod"><value>java.nio.file.Paths.get</value></property> 
    <property name="arguments"> 
     <array> 
      <value>/my/path/name</value> 
      <array/> 
     </array> 
    </property> 
</bean> 
+0

Nope: 'org.springframework.beans.factory.BeanCreationException: Ошибка создания bean с именем 'myPath', определенным в ресурсе пути к курсу [spring.xml]: Не найдено соответствующего метода фабрики: factory method 'java.nio. file.Paths.get() ''. – Raedwald

+0

@ Raedwald см. Мое редактирование. – pingw33n

Смежные вопросы