Внедрить конфигурацию XML непосредственно в контекст приложения Spring

У меня есть объект Java, который может настраиваться с учетом описания конфигурации XML (он также требует других описаний, но в данный момент меня интересует XML). Мне интересно, могу ли я встроить описание XML непосредственно в описание контекста приложения Spring. Я представляю себе что-то вроде:

<bean id = "myXMLConfiguredBean" class = "com.example.Foo">
  <constructor-arg type = "xml">
    <myconfig xmlns = "http://example.com/foo/config">
      <bar>42</bar>
    </myconfig>
  </constructor-arg>
</bean>

но я понятия не имею, возможно ли это - или что-то в этом роде. Я понимаю, что могу встроить myconfig в раздел CDATA, но это кажется немного некрасивым.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
1 719
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Spring XSD позволяет <constructor-arg> содержать любой XML через:

<xsd:element name = "constructor-arg">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element ref = "description" minOccurs = "0" />
        <xsd:choice minOccurs = "0" maxOccurs = "1">
          <xsd:element ref = "bean" />
          <xsd:element ref = "ref" />
          <xsd:element ref = "idref" />
          <xsd:element ref = "value" />
          <xsd:element ref = "null" />
          <xsd:element ref = "list" />
          <xsd:element ref = "set" />
          <xsd:element ref = "map" />
          <xsd:element ref = "props" />
          <!-- Any XML -->
          <xsd:any namespace = "##other" processContents = "strict" />
        </xsd:choice>
      </xsd:sequence>
      ...
  </xsd:complexType>
</xsd:element>

Где атрибуты processContents могут иметь один из три значения

strict: There must be a top-level declaration for the item available, or the item must have an xsi:type, and the item must be ·valid· as appropriate.

Итак, пока ваш XML-файл конфигурации имеет схему и вы правильно ее импортируете, это должно работать.

Затем вам нужно будет зарегистрировать PropertyEditor для вашего XML, используя CustomEditorConfigurer

Надеюсь это поможет

Разве не было бы чище, если бы у вашего bean-компонента было свойство, указывающее ему местоположение файла конфигурации, и он загружал бы конфигурацию из пути к классам (или абсолютного местоположения в файловой системе)? Таким образом, ваша конфигурация Spring выглядит чище, и вам будет проще редактировать XML-конфигурацию вашего bean-компонента, поскольку она находится в отдельном файле.

Возможно, вы даже сможете сделать это, используя функцию ресурсов в контексте приложения Spring.

Другие вопросы по теме