Хорошо, это похоже на полное решение для всех случаев, упомянутых в вопросе, проверенных с помощью Python 2.7 и Python 3.5. Общее решение закончилось тем, что повторно открыло дескриптор файла, но вместо io.BytesIO вам нужно использовать канал для тестового двойника, чтобы у вас был файловый дескриптор.
import io
import subprocess
import os
# Example function, re-opens a file descriptor for UTF-8 decoding,
# reads until EOF and prints what is read.
def read_as_utf8(fileno):
fp = io.open(fileno, mode="r", encoding="utf-8", closefd=False)
print(fp.read())
fp.close()
# Subprocess
gpg = subprocess.Popen(["gpg", "--version"], stdout=subprocess.PIPE)
read_as_utf8(gpg.stdout.fileno())
# Normal file (contains "Lorem ipsum." as UTF-8 bytes)
normal_file = open("loremipsum.txt", "rb")
read_as_utf8(normal_file.fileno()) # prints "Lorem ipsum."
# Pipe (for test harness - write whatever you want into the pipe)
pipe_r, pipe_w = os.pipe()
os.write(pipe_w, "Lorem ipsum.".encode("utf-8"))
os.close(pipe_w)
read_as_utf8(pipe_r) # prints "Lorem ipsum."
os.close(pipe_r)
Я решил ту же проблему, добавив в мой проект следующие библиотеки Jar:
из папки: C:\Program Files\glassfish-4.0\glassfish\lib
Ссылки на эти библиотеки были повреждены, а Netbeans не нашли подходящие классы для использования.
В большинстве случаев эти настройки также определены в файле jndi.properties
. У вас есть тот, кто лежит где-то?
убедитесь, что включены зависимости для именования причалов и причала плюс (не только предоставленная область). Это исправило это для меня.
В частности, я получил эту проблему при попытке получить по умолчанию (no-args) InitialContext
во встроенном экземпляре Tomcat7 в SpringBoot.
Решение для меня заключалось в том, чтобы сообщить Tomcat enableNaming
.
, т.е.
@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
tomcat.enableNaming();
return super.getTomcatEmbeddedServletContainer(tomcat);
}
};
}
Является проблемой JNDI. Вы увидите это исключение, если класс InitialContext не имеет свойств по умолчанию для поставщика услуг JNDI или явно настроенных свойств сервера.
Установите свойство среды Context.INITIAL_CONTEXT_FACTORY для имени класса начальной реализации контекста, с помощью. Этот класс должен быть доступен вашей программе в пути к классам.
Проверить:
http://docs.oracle.com/javase/7/docs/api/javax /naming/InitialContext.html
http://java.sun.com/products/jndi/tutorial/getStarted/TOC.html (проблемы времени выполнения)
Сделайте это:
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
Context initialContext = new InitialContext(props);
Также добавьте это в библиотеки проекта:
C:\installs\glassfish\glassfish-4.1\glassfish\lib\gf-client.jar
соответственно отрегулируйте путь
вам нужно использовать jboss-client.jar в вашем проекте клиента, и вам нужно использовать jnp-client jar в проекте ejb
Пакет javax.naming
содержит API JNDI. Поскольку это просто API, а не реализация, вам нужно сказать, какую реализацию JNDI использовать. Реализации, как правило, специфичны для сервера, с которым вы пытаетесь поговорить.
Чтобы указать реализацию, вы передаете объект Properties
при создании InitialContext
. Эти свойства определяют используемую реализацию, а также местоположение сервера. Конструктор InitialContext
по умолчанию полезен только при наличии системных свойств, но свойства такие же, как если бы вы передавали их вручную.
Что касается свойств, которые необходимо установить, которые зависят от вашего сервер. Вам нужно отследить эти настройки и подключить их.
вам нужно поместить следующие пары имени / значения в Hashtable и вызвать этот конструктор:
public InitialContext(Hashtable<?,?> environment)
точные значения зависят от вашего сервера приложений, этот пример для jboss
jndi.java.naming.provider.url=jnp://localhost:1099/
jndi.java.naming.factory.url=org.jboss.naming:org.jnp.interfaces
jndi.java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
Моя проблема с этим состояла в том, что я создавал сеанс hibernate, но неправильно настроил параметры JNDI для моего экземпляра базы данных из-за проблемы с classpath. Просто FYI ...
Easy & amp; настраиваемое решение создает один файл jndi.properties и помещает этот файл в classpath. jndi.properties может быть создан как
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
# use the following property to configure the default connector
java.naming.provider.url = vm://localhost
# use the following property to specify the JNDI name the connection factory
# should appear as.
#connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactry
# register some queues in JNDI using the form
# queue.[jndiName] = [physicalName]
queue.MyQueue = example.MyQueue
# register some topics in JNDI using the form
# topic.[jndiName] = [physicalName]
topic.MyTopic = example.MyTopic
Просто укажите свою фабрику имен и amp; url и поместите этот файл в свой путь к классам. JMS будет получать необходимую информацию сама по себе, и ее также легко настроить в будущем.