Как установить эквивалент web.xml JNDI <env-entry> в проекте Spring Boot?

Ссылаясь на этот ответ SO, я хотел бы настроить эквивалент этой конфигурации web.xml в приложении JSF / JoinFaces / SpringBoot (которое не имеет web.xml).

<env-entry>
    <env-entry-name>jsf/ClientSideSecretKey</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>[AES key in Base64 format]</env-entry-value>
</env-entry>

Любые указатели?

Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Интеграция Slack и Spring Boot: как отправлять сообщения из Java-приложений
Интеграция Slack и Spring Boot: как отправлять сообщения из Java-приложений
Как отправлять сообщения в slack с помощью spring boot легко и без зависимостей.
0
0
986
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

По сути, <env-entry> объявляет атрибут контекста веб-приложения.

Вы можете инициализировать свой контекст сервлета и предоставить эквивалентные атрибуты контекста сервлета в своем приложении Spring Boot.

Для этого вы можете зарегистрировать bean-компонент, который реализует интерфейс ServletContextInitializer (или WebApplicationInitializer, если ваше приложение должно быть развернуто в традиционном контейнере сервлетов). Например:

public class JsfServletContextInitializer implements ServletContextInitializer {

  @Override
  public void onStartup(ServletContext servletContext) throws ServletException {
    servletContext.setAttribute("jsf/ClientSideSecretKey", "[AES key in Base64 format]");
  }

}

Не забудьте зарегистрировать его как бин в вашей конфигурации.

Если вы используете весеннюю загрузку и встроенный сервер tomcat, вы можете добавить <env-entry> программно со следующей конфигурацией.

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
    
    
    @Bean
    public TomcatServletWebServerFactory tomcatFactory() {
        return new TomcatServletWebServerFactory() {
            @Override
            protected TomcatWebServer getTomcatWebServer(org.apache.catalina.startup.Tomcat tomcat) {
                tomcat.enableNaming(); 
                return super.getTomcatWebServer(tomcat);
            }

            @Override 
            protected void postProcessContext(Context context) {

                // adding <resource-ref>
                ContextResource resource = new ContextResource();
                resource.setName("jdbc/myJndiResource");
                resource.setType(DataSource.class.getName());
                resource.setProperty("driverClassName", "org.postgresql.Driver");

                resource.setProperty("url", "jdbc:postgresql://hostname:port/dbname");
                resource.setProperty("username", "username");
                resource.setProperty("password", "password");
                context.getNamingResources()
                       .addResource(resource); 
                
                // adding <env-entry>
                ContextEnvironment ce = new ContextEnvironment();
                ce.setName("jsf/ClientSideSecretKey");
                ce.setType(String.class.getName());
                ce.setValue("[AES key in Base64 format]");
                context.getNamingResources().addEnvironment(ce); 
                
            }
        };
    }

    public static void main(String[] args) throws NamingException {
        SpringApplication.run(DemoApplication.class, args);
    }

}

После определения ресурсов именования jndi к ним можно получить доступ в вашем приложении, используя JndiTemplate из InitialContext.

JndiTemplate jndiTemplate = new JndiTemplate();
String str = (String) jndiTemplate.lookup("java:comp/env/jsf/ClientSideSecretKey");

Надеюсь, это поможет вам в решении вашей проблемы.

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