2012-05-30 3 views
3

Я хотел бы привязать объект DataSource к контексту JNDI (eclipse) программно. Мне нужно для тестирования. Вот кусок кода, который я есть сейчас:Jetty Bind DataSource в контенте JNDI

server = new Server(SERVER_PORT); 
webAppContext = new WebAppContext(); 
webAppContext.setResourceBase("."); 
webAppContext.setContextPath("/" + SERVER_CONTEXT); 
webAppContext.addEventListener(prepareServletContextListener()); 
webAppContext.addFilter(GuiceFilter.class, "/*", null); 
webAppContext.addServlet(DefaultServlet.class, "/"); 
Resource r = new Resource(webAppContext,"jdbc/testDS",createDataSource()); 

server.setHandler(webAppContext); 
server.start(); 

Конечно линия с ресурсом не working.I не имеют ни малейшего представления о том, как связать его программно получить STH похожие на:

<New id="DSTest" class="org.eclipse.jetty.plus.jndi.Resource"> 
<Arg></Arg> 
<Arg>jdbc/DSTest</Arg> 
<Arg> 
    <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"> 
     <Set name="Url">jdbc:mysql://localhost:3306/databasename</Set> 
     <Set name="User">user</Set> 
     <Set name="Password">pass</Set> 
    </New> 
</Arg> 
</New> 

Любой Помощь будет принята с благодарностью.

ответ

2

я столкнулся с таким же вопросом, и вот что я сделал, чтобы исправить это:

server = new Server(PORT); 
    WebAppContext context = new WebAppContext(); 
    context.setContextPath(CONTEXT); 
    context.setConfigurationClasses(new String[] { "org.eclipse.jetty.plus.webapp.PlusConfiguration", 
      "org.eclipse.jetty.webapp.FragmentConfiguration" }); 
    // A filter needed by Guice, but this is independent 
    context.addFilter(GuiceFilter.class, "/*", 0); 
    PGSimpleDataSource simpleDataSource = new PGSimpleDataSource(); 
    simpleDataSource.setDatabaseName("db-name"); 
    simpleDataSource.setUser("user"); 
    simpleDataSource.setPassword("pwd"); 
    String jndiName = "jdbc/myDS"; 
    Resource resource = new Resource("java:comp/env/" + jndiName, simpleDataSource); 
    server.setHandler(context); 
    // an event listener (because I use Guice, but this is independent) 
    GuiceServletConfig guiceServletConfig = new GuiceServletConfig(); 
    context.addEventListener(guiceServletConfig); 
    server.start(); 

Для этого необходимо иметь следующие дополнительные библиотеки:

  • jetty-jndi
  • jetty-plus

Я тестировал этот код на встраиваемом Jetty 7 (7.6.10.v20130312)

+1

Пожалуйста, объясните, как ресурс подключается к серверу! –

4

необходимо добавить определенный объект ресурса в качестве атрибута для объекта сервера. должен работать:

Resource r = new Resource("jdbc/testDS",createDataSource()); 
server.setAttribute("myDs", r); 
1

Тема старая, но я столкнулся с той же проблемой. К сожалению, существующие ответы не дают решения.

При создании Resource, указывающего экземпляр DataSource, Jetty не будет предоставлять этот экземпляр при запросе ресурса JNDI. Вместо этого конструктор Resource пытается преобразовать экземпляр в какой-то «рецепт» (точнее, javax.naming.Reference), который рассказывает, как построить новый экземпляр конфигурации с точно такими же внутренностями.

Он хорошо работает в случае базовых классов, но не воссоздает сложные структуры данных (в моем случае он не с List<String>). Таким образом, вы в конечном итоге не получают:

  • тот же экземпляр (как вы ожидаете от одноточечного)
  • точный эквивалент экземпляра (как вы ожидаете работает нормально JNDI)

I реализовали оболочку, которая позволяет предоставить экземпляр, указанный при создании Resource.

import java.util.Hashtable; 
import javax.naming.Context; 
import javax.naming.Name; 
import javax.naming.Reference; 
import javax.naming.spi.ObjectFactory; 

public class ExistingInstanceReference extends Reference implements ObjectFactory { 

    private Object instance; 

    private static final long serialVersionUID = -2718709718400909747L; 

    public ExistingInstanceReference() { 
     super(null); 
    } 

    public ExistingInstanceReference(Object instance) { 
     super(instance.getClass().getName(), ExistingInstanceReference.class.getName(), null); 
     this.instance = instance; 
    } 

    @Override 
    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception { 
     if (obj == null) { 
      return null; 
     } 
     ExistingInstanceReference reference = (ExistingInstanceReference) obj; 
     return reference.instance; 
    } 

} 

Обратите внимание, что эта реализация не соответствует Serializable интерфейсу, как instance переменным может содержать несериализуемый объект.

Использование:

Resource r = new Resource(webAppContext, "jdbc/testDS", new ExistingInstanceReference(createDataSource())); 

Пожалуйста, считают это решение как временное решение, так как реальная проблема все еще быть исправлены где-то в источниках Jetty в. К сожалению, у меня нет времени проследить это неправильное поведение с корнем.

Кроме того, мне пришлось установить webAppContext.setParentLoaderPriority(true), потому что загрузчик классов webapp не видел класс ExistingInstanceReference в моей настройке.

Смежные вопросы