Контекст прочитан только

Helo masters, I have to create a JNDI Datasource dynamically, I tried to do it with a listener called SetupApplicationListener. Here is the beginning of WEB-LIB/web.xml

<?xml version="1.0" encoding="UTF-8"?>


    pri-web

    <!-- Listeners -->
    
        org.apache.myfaces.webapp.StartupServletContextListener
    
    
        myapp.SetupApplicationListener
    

Кодекс слушателя:

public class SetupApplicationListener implements ServletContextListener {

    public static Log LOG = null;

    public void contextInitialized(ServletContextEvent ctx){
        try {            
            createOracleDataSource();
.....
        }
    }

    private void createOracleDataSource() throws SQLException, NamingException {
        OracleDataSource ds = new OracleDataSource();
        ds.setDriverType(...);
        ds.setServerName(...);
        ds.setPortNumber(...);
        ds.setDatabaseName(...);
        ds.setUser(...);
        ds.setPassword(...);

        new InitialContext().bind("java:comp/env/jdbc/myDS", ds);
    }

.....
}

И есть ошибка:

[ERROR] 29/01/2013 09:44:50,517 (SetupApplicationListener.java:86) -> Error
javax.naming.NamingException: Context is read only
    at org.apache.naming.NamingContext.checkWritable(NamingContext.java:903)
    at org.apache.naming.NamingContext.bind(NamingContext.java:831)
    at org.apache.naming.NamingContext.bind(NamingContext.java:171)
    at org.apache.naming.NamingContext.bind(NamingContext.java:187)
    at org.apache.naming.SelectorContext.bind(SelectorContext.java:186)
    at javax.naming.InitialContext.bind(InitialContext.java:359)
    at myapp.SetupApplicationListener.createOracleDataSource(SetupApplicationListener.java:102)

Я могу установить свойства только для чтения Контекста к "истинному"? Спасибо!:)

Tomcat 6.0
Oracle 11g
jdk1.5

EDIT: Don't need to be dynamically, i have to define a jndi datasource internally I can't modify the server files because it is a shared server. It must be jndi because other modules use it in that way, thanks.

6
решенный благодаря OscarRyz stackoverflow.com/questions/13734391/…
добавлено автор rubenGL, источник

7 ответы

Если необходимо создать источник данных, динамично там действительно какая-либо потребность в поиске JNDI? JNDI разработан, чтобы установить связь, внешнюю с применением, в то время как в вашем сценарии его сильно связанное с применением из-за законного требования. Почему не только используют связь JDBC?

4
добавлено
@rubenGL, но couldn' t они просто проверяют context.xml файл, чтобы получить эти ценности?
добавлено автор Kevin Bowersox, источник
@rubenGL, Если строка подключения находится в исходном коде даже тогда кто-то (у принятия есть доступ к коту) может извлечь .class файл и декомпилировать, чтобы проверить строку подключения, если класс не был obfiscated с неприятием получения исходного кода.
добавлено автор Anugoonj, источник
потому что есть некоторые модули это касательно connetion с jndi. Из-за проблем безопасности они не хотят помещать ценности связи (пользователь, проход...) в сервере, потому что это - общий сервер.
добавлено автор rubenGL, источник
Я должен определить jndi источник данных в приложении, внутренне, вы знаете другой способ сделать это без слушателя?
добавлено автор rubenGL, источник
Не должны быть динамично
добавлено автор rubenGL, источник
context.xml - файл сервера, они не хотят помещать ценности связи в сервер
добавлено автор rubenGL, источник

От раздела EE.5.3.4 спецификации EE 6 платформы (JSR 316):

Контейнер должен гарантировать что случаи компонента приложения имейте только доступ для чтения к их контексту именования. Контейнер должен бросьте javax.naming. OperationNotSupportedException от весь методы javax.naming. Интерфейс Context, которые изменяют контекст именования окружающей среды и его подконтексты.

Обратите внимание, что "их контекст именования" в этом разделе относится, чтобы java:comp .

2
добавлено
Я не забываю читать, что в EE6, они принесли java:global, который "не прочитан только". Какая-либо идея об этом? Я haven' t использовал его прежде.
добавлено автор John, источник

У меня нет этой проблемы, прежде чем с тех пор я обычно определял JNDI в сервере приложений (кот, weblogic и и т.д.). Точно так же, как то, что сказал Кевин, это точно, для чего был разработан JNDI; отделение конфигурации источника данных из вашего исходного кода и восстановление ресурсов JNDI посредством поиска и вводят;

Назад к вашему вопросу, я думаю, что кот имеет каждый строгие правила об изменении JNDI во времени выполнения. В другом слове вы не можете снова переплести или удалить jndi из Контекста. Если вы пройдете спецификацию кота, то вы будете, вероятно, видеть некоторую вещь о jndi поиске, но не снова переплетать.

2
добавлено
+1 user2021142, JNDI предназначается, чтобы расцепить исходный код от конфигурации возможности соединения. Конфигурации JNDI на сервере могут быть ограничены только пользователями Администратора если, именно это служит цели безопасности. Кроме того, соединение с базой данных может быть SSL, позволенным избегать любых злонамеренных поисков.
добавлено автор Anugoonj, источник
Есть некоторые модули это касательно connetion с jndi. Из-за проблем безопасности они не хотят помещать ценности связи (пользователь, проход...) в сервере, потому что это - общий сервер. Я должен определить jndi источник данных в приложении, внутренне, вы знаете другой способ сделать это без слушателя?
добавлено автор rubenGL, источник
Не должны быть динамично
добавлено автор rubenGL, источник

Необходимо создать ServletContextListener, и там можно сделать InitialContext перезаписываемым - это не способ, которым это должно быть сделано, но если вам действительно нужен он, это - один способ, которым можно сделать это.

Это также работает с Явской Мелодией!

protected void makeJNDIContextWritable(ServletContextEvent sce) {
    try {
        Class<?> contextAccessControllerClass = sce.getClass().getClassLoader().loadClass("org.apache.naming.ContextAccessController");
        Field readOnlyContextsField = contextAccessControllerClass.getDeclaredField("readOnlyContexts");
        readOnlyContextsField.setAccessible(true);
        Hashtable readOnlyContexts = (Hashtable) readOnlyContextsField.get(null);
        String context = null;
        for (Object key : readOnlyContexts.keySet()) {
            String keyString = key + "";
            if (keyString.endsWith(sce.getServletContext().getContextPath())) {
                context = keyString;
            }
        }
        readOnlyContexts.remove(context);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
2
добавлено

Я решил эту проблему, когда найдено, что я закрывал объект environmentContext Например:

Context context=new InitialContext();
Context environmentContext=(Context) context.lookup("java:comp/env");

И мой код был:

environmentContext.close();

После удаления близкой функции от environmentContext проблемы был solded для меня;

0
добавлено

Я решил эту проблему, установив useNaming = "ложный" в моем context.xml.

From the documentation:

useNaming: Набор к истинному (дефолт), чтобы сделать, чтобы Каталина позволила JNDI InitialContext для этого веб-приложения, которое совместимо с Java2 Enterprise Edition (J2EE) соглашения платформы.

0
добавлено

У меня также была эта проблема, но быть в новинку для Tomee, я не знал, что есть простое решение. Когда я развернул свое веб-приложение к webapps папке, приложение хорошо работало, но когда я развернул его к сервисной папке, я получил то же самое аварийное прекращение работы. Проблема состояла в том, что имя папки не соответствовало военному имени (минус .war). Как только я зафиксировал это, приложение хорошо работало. Удостоверьтесь, что военное имя, имя папки и сервисное название идентичны. Эта проблема производит несколько различных ошибок, включая Контекст прочитан только и Ошибка, сливающая Явские записи EE JNDI.

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Spring Framework and more
Spring Framework and more
839 участник(ов)

чат о spring framework и связанных с ним технологиях. We're discussing: job, tech questions, beer meet up/networking: tech review ,LinkedIn skills, SOF q/a raise up& etc. languages: russian,java,eng.

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async