Свойство Spring-заполнитель для настройки positiveInteger

#spring #properties #spring-security

#spring #свойства #spring-безопасность

Вопрос:

Я хотел бы сопоставить настройку порта моего ldapserver со свойством в моем файле свойств. Но когда я использую ${ldapserverport} , чем я получаю ошибку:

«Значение ‘${ldapserverport}’ атрибута ‘port’ для элемента ‘ldap-server’ недопустимо в отношении его типа ‘positiveInteger'».

Можно ли каким-либо образом использовать это свойство? Остальные свойства работают идеально.

мой код:

 <ldap-server id="ldapServer" url="${ldapserverurl}" 
        port="${ldapserverport}"
        manager-dn="${ldapserveruser}" 
        root="${ldapserverroot}"
        manager-password="${ldapserverpassword}"/>
  

Комментарии:

1. Откуда <ldap-server> взялось? Это не определение компонента Spring.

2. Почему вы не указываете порт в URL?

3. ldap-сервер является частью пространства имен spring-security. Он находится в отдельном XML-файле с этим пространством имен по умолчанию, поэтому в нем нет префикса. Я мог бы указать порт в URL, который решил бы эту конкретную проблему. Но я хотел бы знать, возможно ли, возможно, использовать свойства такого типа.

Ответ №1:

Это недостаток подхода «пользовательского пространства имен», используемого некоторыми стилями конфигурации Spring. Хотя это позволяет выражать конфигурации очень кратко, оно также очень специфично и автоматически не допускает никакой общей логики подстановки, используемой в <bean> определениях стиля, включая заполнители свойств.

Если автор схемы ввел жестко установленное требование, чтобы данный атрибут был целым числом, то обойти это невозможно — автор схемы и код, который ее анализирует, должны были бы добавить явную поддержку заполнителей. В этом случае они этого не сделали.

Итак, если вы хотите использовать заполнители, вам придется «разбить» <ldap-server> определение ярлыка на график базовых <bean> определений. Это не всегда просто, поскольку в документах приходится объяснять, какие компоненты на самом деле определяются <ldap-server> .

Комментарии:

1. Оке, это действительно сокращение. Спасибо за быстрый ответ, я попробую решение по добавлению порта в URL.

2. Я бы предложил подать JIRA. Люк и Роб хорошо справились с устранением подобных проблем с помощью замены заполнителя свойства.

Ответ №2:

     <bean id="ldap-server" class="org.springframework.security.ldap.server.ApacheDSContainer">
      <constructor-arg index="0" value="dc=test,dc=com"/>
      <constructor-arg index="1" value="classpath:ldap_init.ldif"/>
      <property name="port" value="${ldapserverport}"/>
    </bean>
  

Могут потребоваться следующие зависимости

     <dependency>
      <groupId>org.apache.directory.server</groupId>
      <artifactId>apacheds-core</artifactId>
      <version>1.5.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.directory.server</groupId>
      <artifactId>apacheds-core-entry</artifactId>
      <version>1.5.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.directory.server</groupId>
      <artifactId>apacheds-protocol-ldap</artifactId>
      <version>1.5.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.directory.server</groupId>
      <artifactId>apacheds-protocol-shared</artifactId>
      <version>1.5.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.directory.server</groupId>
      <artifactId>apacheds-server-jndi</artifactId>
      <version>1.5.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.directory.shared</groupId>
      <artifactId>shared-ldap</artifactId>
      <version>0.9.15</version>
    </dependency>