我正在试用Netflix OSS来实现一个微服务架构。我希望在运行时从bootstrap.yml文件记录server.port
以查看哪个实例为请求提供服务。
我使用的是Java8。
重要的库版本为:
*spring-boot-starter-web-1.5.8
*spring-boot-starter-tomcat-1.5.8
*tomcat-embedd-core-8.5.23
在浏览了stackoverflow之后,我发现了这个和这个,但是这些解决方案都不起作用。
spring:
application:
name: some-service
server:
port: ${port:8088}
我尝试了以下代码:
@SpringBootApplication
@EnableEurekaClient
@SuppressWarnings("javadoc")
public class SomeService {
private static Logger logger = LoggerFactory.getLogger(SomeService .class);
@LocalServerPort
private static int randomServerPort;
@LocalManagementPort
private static int randomManagementPort;
@Autowired
private static Environment environment;
@Value("${server.port}")
// @Value("${local.server.port}")
private static int port;
public static void main(String[] args) {
SpringApplication.run(SomeService .class, args);
logger.info("randomServerPort : {}", randomServerPort);
logger.info("randomManagementPort : {}", randomManagementPort);
logger.info("server.port : {}", port);
logger.info("environment.getProperty(\"server.port\") : {}", environment.getProperty("server.port"));
}
对应的输出为:
randomServerPort : 0
randomManagementPort : 0
server.port : 0
java.lang.NullPointerException against environment.getProperty("server.port")
前三个日志语句log0
,而最后一个则抛出`NullPoInterException*。
s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8088 (http)
静态字段不在Spring中注入。
您需要做的是首先使它成为一个实例字段。
然后只有在Spring Boot容器初始化它之后才使用它。
将它们移动到用@postconstruct
注释的方法中应该可以完成这项工作,因为在执行依赖项注入之后调用它。
@SpringBootApplication
@EnableEurekaClient
@SuppressWarnings("javadoc")
public class SomeService {
private static Logger logger = LoggerFactory.getLogger(SomeService .class);
@LocalServerPort
private static int randomServerPort;
@LocalManagementPort
private static int randomManagementPort;
@Autowired
private static Environment environment;
@Value("${server.port}")
private int port;
@PostConstruct
public void postConstruct(){
logger.info("randomServerPort : {}", randomServerPort);
logger.info("randomManagementPort : {}", randomManagementPort);
logger.info("server.port : {}", port);
logger.info("environment.getProperty(\"server.port\") : {}", environment.getProperty("server.port"));
}
public static void main(String[] args) {
SpringApplication.run(SomeService .class, args);
}
}
我正在用Apache Camel路由为Spring Boot应用程序创建一些单元测试,使用Spock作为测试框架,我需要模拟来自另一个应用程序的响应。我为此制作了一个模拟控制器,但我需要将测试正在运行的端口注入一个属性。有没有方法获得测试正在运行的端口? 我试过 另外,是否有方法在文件中注入该随机端口?理想情况下,我需要在文件中执行以下操作: 其中端口是运行测试的随机端口。
如何在运行Tomcat时获取包版本? 我尝试getClass().getPackage().GetImplementationVersion(),但这总是返回。我想这是因为我的war还没有打包,而Tomcat执行了.classes(又名分解的war)。存在于终战中,但不存在于文件夹中 java.lang.Package 相关的是在运行时获取Maven工件版本 更新。之前我已经添加了war构建的配置
我有一个Spring Boot应用程序(使用嵌入式Tomcat7),并且我在中设置了,这样我就可以有一个随机端口。在服务器启动并在一个端口上运行之后,我需要能够获得所选择的端口。 我不能使用,因为它为零。这是一条看似简单的信息,那么为什么我不能从我的java代码中访问它呢?我如何访问它?
我正在开发一个spring启动应用程序并编写一些junit测试。 但我发现,当我运行任何测试时,tomcat也会启动,这使得这些测试非常缓慢,浪费了很多时间。 当我开发一个SpringMvc应用程序时,junit测试可以在不启动tomcat的情况下运行,这节省了很多时间。 所以,我想问它在那里无论如何要运行启动tomcat的springstart测试?
我如何获得在运行时部署我的应用程序的主机和端口,以便在我的java方法中使用它?
我正在尝试在Centos tomcat7上托管一个网站,如果我在端口80上运行tomcat7,一切正常,即74.208.164.45,但如果我想使用https://74.208.164.45/,它不起作用,但如果我这样尝试https://74.208.164.45:8443/添加密钥库之后,它就可以正常工作了。 所以,我需要一种在80和https上运行tomcat的方法,即https://74.2