Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 春靴豆订单_Java_Spring_Spring Boot - Fatal编程技术网

Java 春靴豆订单

Java 春靴豆订单,java,spring,spring-boot,Java,Spring,Spring Boot,我正在尝试使用jetty EmbeddedContainerServlet和jndi数据源配置spring引导项目,代码如下 @Configuration public class EmbeddedJettyServer { @Value("${jetty.http.port:8080}") private Integer port; @Value("${jetty.threadPool.maxThreads:200}") private String maxThreads;

我正在尝试使用jetty EmbeddedContainerServlet和jndi数据源配置spring引导项目,代码如下

@Configuration
public class EmbeddedJettyServer {

  @Value("${jetty.http.port:8080}")
  private Integer port;
  @Value("${jetty.threadPool.maxThreads:200}")
  private String maxThreads;
  @Value("${jetty.threadPool.minThreads:8}")
  private String minThreads;
  @Value("${jetty.threadPool.idleTimeout:60000}")
  private Integer idleTimeout;

private JettyServerCustomizer jettyServerCustomizer() {
    return new JettyServerCustomizer() {

        @Override
        public void customize(Server server) {
            try {
                // Tweak the connection pool used by Jetty to handle
                // incoming HTTP connections
                final QueuedThreadPool threadPool = new QueuedThreadPool();
                threadPool.setMaxThreads(Integer.valueOf(maxThreads));
                threadPool.setMinThreads(Integer.valueOf(minThreads));
                server.getBeans().add(threadPool);
                WebAppContext webAppContext = (WebAppContext) server.getHandler();
                createConfiguration(
                    "/Users/kewnen/git/zeus-info-provider/zeus-info-provider-web/ops/resources/jetty-datasource.xml")
                        .configure(webAppContext);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        private XmlConfiguration createConfiguration(String xml) throws IOException, SAXException {
            return new XmlConfiguration(new FileInputStream(xml));
        }
    };
}

@Bean
public EmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {
    final JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory = new JettyEmbeddedServletContainerFactory() {
        @Override
        protected JettyEmbeddedServletContainer getJettyEmbeddedServletContainer(Server server) {
            return new JettyEmbeddedServletContainer(server);
        }
    };
    jettyEmbeddedServletContainerFactory.addServerCustomizers(jettyServerCustomizer());
    jettyEmbeddedServletContainerFactory.setPort(port);
    jettyEmbeddedServletContainerFactory.setSessionTimeout(idleTimeout);
    return jettyEmbeddedServletContainerFactory;
}
@Bean
public DataSource dataSource() {
    JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
    return dsLookup.getDataSource("jdbc/zeus-info");
}
}

jetty-datasource.xml文件的内容,我在其中定义了datasource内容

  <?xml version="1.0"?>
   <Configure class="org.eclipse.jetty.webapp.WebAppContext">
     <Set name="contextPath">/</Set>

      <New id="cf" class="org.eclipse.jetty.plus.jndi.Resource">
         <Arg>jdbc/zeus-info</Arg>
         <Arg>
             <New class="org.apache.commons.dbcp.BasicDataSource">
            <Set name="driverClassName">org.postgresql.Driver</Set>
            <Set name="url">jdbc:postgresql://localhost:5433/myDb</Set>
            <Set name="username">postgres</Set>
            <Set name="password">password</Set>
            <Set name="validationQuery">SELECT 1</Set>
        </New>
    </Arg>
</New>
当我运行它时,我得到了这个异常

  Caused by: javax.naming.NameNotFoundException; remaining name 'jdbc/zeus-info'
at     org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:490)
at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:536)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:155)
at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)
at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:179)
at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:104)
at org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup.getDataSource(JndiDataSourceLookup.java:45)
debuggin时,我清楚地看到数据源bean在JettyEmbeddedServletContainerFactory定义之前实例化,在这里我定义了我的jndi数据源

我试图通过向datasource定义中添加@DependsOn注释来强制执行命令,但没有成功,它总是在容器之前实例化datasource bean

编辑:

更详细地说,

我已经通过在不使用jndi的情况下定义datasource对其进行了测试,效果良好:

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(DRIVER_CLASS_NAME);
    dataSource.setUrl(URL);
    dataSource.setUsername(USER);
    dataSource.setPassword(PASS);
    return dataSource;
}
但由于这是从classique war和jndi定义的数据源到spring boot jar打包项目的迁移,我想从现有项目中复制同样的内容,因为我不知道将jndi方式更改为这种方式会产生什么影响

我试图通过在datasource定义中添加这一行来强制datasource在容器之后实例化

 @DependsOn("jettyEmbeddedServletContainerFactory")
但始终在jetty容器之前实例化数据源

修复:

问题是spring boot自动配置了一个名为jettyEmbeddedServletContainerFactory的容器,这就是为什么 @DependsOn(“jettyEmbeddedServletContainerFactory”)不起作用

我补充说

@EnableAutoConfiguration(exclude = EmbeddedServletContainerAutoConfiguration.class)
到我的应用程序,现在它的工作


谢谢你的帮助

您可以使用Spring引导属性来初始化数据源bean,而不是JNDI:

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.password=password
spring.datasource.type=org.apache.commons.dbcp.BasicDataSource
spring.datasource.url=jdbc:postgresql://localhost:5433/myDb
spring.datasource.username=postgres
spring.datasource.validation-query=SELECT 1
对评论的反应:

因此,您的开发环境应该尽可能接近Prod。因此,我不会使用嵌入式容器,而是使用独立的容器进行开发。对于CI构建,您可以使用
maven jetty plugin或

谢谢你的回答,我编辑我的评论以添加更多细节,想法是使用我们生产环境中使用的jetty xml文件在我的嵌入式容器中复制相同的内容,这就是为什么我尝试使用JNDI为什么你不建议使用嵌入式容器,有什么原因吗?因为您正在生产中使用WAR部署。您希望在尽可能接近生产环境的环境中进行开发。我发现了为什么以前要实例化数据源,但没有解决我的问题。。。我编辑了我的评论,需要使用spring boot将war打包更改为jar打包,使用独立微服务的方法,因此我们将为每个微服务的开发团队提供相应的jar,但我应该从生产环境中复制相同的jetty配置