我正在构建一个应用程序框架(作为实现的一部分)使用 Spring FilterRegistrationBeanbean 注册过滤器。注册方法(用 注释@Bean)根据确定过滤器是否打开或关闭的某种逻辑返回FilterRegistrationBean包装真实过滤器或虚拟过滤器。ServletContextInitializer(这种方式可以避免停用的过滤器使过滤器链变得混乱。)
// This method is in some other class which is an `@Component`, and not within the same class as the `Filter` itself
@Bean
public ServletContextInitializer register() {
if (someLogic()) {
Filter filter = new MyRealFilter();
FilterRegistrationBean frb = new FilterRegistrationBean(filter);
// ... Stuff to do with configuring the filter patterns etc. ...
return frb;
} else {
return new DummyServletContextInitializer(); // a SCI which does nothing
}
} …Run Code Online (Sandbox Code Playgroud) 这肯定是一个普遍的问题.我有一个属性文件my-settings.properties,由应用程序类读取.当我编写测试类时,它需要测试可能存在的事物的不同场景,my-settings.properties以确保最大的代码覆盖率(例如,空属性文件,基本属性文件等).但我只能有一个my-settings.properties在我的src/test/resources.
如果只有一些注释,真正伟大的是什么
@MockFileOnClassPath(use = "my-settings-basic.properties", insteadOf = "my-settings.properties")
然后我可以my-settings-XXX.properties在我的文件中有多个文件,/src/test/resources并在每个测试方法上注释正确的文件.但我找不到这样的东西.我正在使用JUnit 4.12.
我可以想到几个粗糙的解决方案:
getResource.不知道我会怎么连做,尤其是有100万不同的方式来获取文件(this.getClass().getResourceAsStream(...),MyClass.class.getResourceAsStream(...),ClassLoader.getSystemClassLoader().getResourceAsStream(...)等)我只是认为这一定是一个常见的问题,也许JUnit,Mockito,PowerMock,EasyMock等已有解决方案?
编辑:有人指出这个问题是重复的为从Eclipse运行的所有JUnit测试指定自定义log4j.properties文件但事实并非如此.那个问题是想要在主调用和测试调用之间有一个不同的属性文件.对我来说,我希望在测试调用和另一个测试调用之间有一个不同的属性文件.
我想在BeanNamingStrategy使用Spring Boot配置应用程序时指定自定义.默认情况下,Spring Boot使用的MethodNameStrategy是a BeanNamingStrategy.
我想这样做的原因是因为我有抽象的父类,我的消费者将创建它的配置子类.父类中的方法具有彼此相同的名称,因此不会为子类的不同实现进行注册.我的自定义BeanNamingStrategy将配置类的简单名称附加到某些bean名称.
通常在Spring应用程序中,您可以BeanNamingStrategy使用setBeanNamingStrategy方法传递自定义ApplicationContext.但是,如果Spring Boot正在创建ApplicationContext,我该怎么做?
我刚刚发现这个,因为我的一个单元测试由于从Java 7升级到Java 8而失败.单元测试调用一个方法,该方法试图在一个在子类上注释但具有不同返回类型的方法上查找注释.
在Java 7中,isAnnotationPresent似乎只能找到注释,如果它们真的是在代码中声明的.在Java 8中,isAnnotationPresent似乎包含在子类中声明的注释.
为了说明这一点,我创建了一个简单的(??)测试类IAPTest(用于IsAnnotationPresentTest).
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
public class IAPTest {
@Retention(RetentionPolicy.RUNTIME)
public static @interface Anno {
}
public static interface I {
}
public static interface IE extends I {
}
public static class A {
protected I method() {
return null;
}
}
public static class B extends A {
@Anno
protected IE method() {
return null;
}
}
public static void main(String[] args) {
for (Method method …Run Code Online (Sandbox Code Playgroud) 假设我正在处理FooException并BarException发生.我们假设它们都是未经检查的例外.
我想在stacktrace中看到的是:
com.bar.BarException: Bar Message
at com.baz.BazCode(BazCode.java:123)
...
Caused by: com.foo.FooException: Foo Message
at com.baz.BazCode(BazCode.java:321)
....
Caused by: ...
Run Code Online (Sandbox Code Playgroud)
但是,默认情况下,所有记录FooException都将从堆栈跟踪中删除.例如:
// In a class written by me
/**
* ...
* @throws FooException if foo happens
* @throws BarException if bar happens
*/
public void upperFrame() {
try {
foo.doSomething();
} catch (FooException foo) {
bar.doSomethingElse();
}
}
// In class Bar (not written by me)
public void doSomethingElse() {
if (someConditionWhichHappensToBeTrueInThisScenario()) {
throw …Run Code Online (Sandbox Code Playgroud) 作为一个例子,假设我有以下课程:
public class FruitBasket {
private List<Apple> apples;
private List<Orange> oranges;
// getters and setters...
}
Run Code Online (Sandbox Code Playgroud)
现在假设我还有一个方法可以获取FruitBasket.
public FruitBasket getFruitBasket() {
//...
}
Run Code Online (Sandbox Code Playgroud)
现在进一步假设该getFruitBasket方法聚合来自两个不同源的数据,这些数据是通过代理访问的。例如,有一个服务器AppleTree用于获取类型 的对象Apple,还有一个服务器OrangeTree用于获取类型 的对象Orange,并且两者都通过名为 的代理进行访问OrchardGate。这就是为什么我想编写一个getFruitBasket方法而不是getApplesand的原因getOranges,以最大限度地减少从我的应用程序调用OrchardGate.
Apple在成功检索对象和对象的情况下Orange,没有问题,我可以直接返回FruitBasket. 如果访问 或 内部或两者OrchardGate中出现问题,我还可以通过抛出 的后代(或者甚至是,如果我将其添加到适当的子句中)来处理此问题。AppleTreeOrangeTreeRuntimeExceptionExceptiongetFruitBasket throws
然而,在部分成功的情况下会发生什么呢?如果我可以正常访问服务器,但由于 和 之间的某些传输问题而无法AppleTree访问服务器,会发生什么情况?OrangeTreeOrchardGateOrangeTree
据我所知,只有四种选择,而且都非常可怕:
Apple成功接收了对象,也FruitBasket …春天启动的日志位置可以通过设定logging.file财产application.properties。但是我想以编程方式设置位置。我的逻辑不基于任何 Spring bean,仅基于反复试验,因为相同的代码必须在可能具有不同安全配置的不同环境中运行。
根据文档:
由于日志记录是在
ApplicationContext创建之前初始化的,因此无法从@PropertySourcesSpring@Configuration文件中控制日志记录。系统属性和传统的 Spring Boot 外部配置文件工作得很好。)[原文如此]
所以我知道我不能使用@Configuration文件,但是我可以使用其他方式(例如静态初始化程序)并且仍然设法以编程方式设置日志记录位置?
(注意:我个人将 SLF4J 与 Logback 一起使用,但 Spring Boot 的日志框架旨在处理不同的日志外观/实现,实际上在内部使用 Commons Logging。)
(注 2:有些人已经注意到这是另一个问题的重复……但那个问题似乎更多地是在谈论配置实际的日志记录实现,而这个问题是关于 Spring Boot 自己的配置。实际上,我无法立即确定从这些答案中如何解决我的具体问题,如相关答案下方的评论中所述。另一个问题的答案主要集中在如何在上下文初始化的正确点加载代码,而我的问题是关于如何以设置日志记录位置。)
默认情况下,NPM将用户配置存储在中~/.npmrc。我的用户配置中有很多东西,我不想干扰我的主项目,但是我切换到另一个需要不同配置的项目,所以我做到了:
npm config set userconfig C:\path\to\another\directory\.npmrc。
令我惊讶的是,NPM在的userconfig现有用户配置中添加了一个新条目~/.npmrc。这对我来说没有意义-似乎NPM需要知道用户配置在哪里才能找出它在哪里!
现在,NPM会忽略我放入新NPMRC文件中的任何属性,而仅从中获取属性~/.npmrc。更奇怪的是,它npm config list包含一个userconfig标头(以分号为前缀的行)指定了我的新位置,但其内容来自~/.npmrc。
例如,如果我~/.npmrc在新的NPMRC中将电子邮件设置为“ foo@example.com”,在新NPMRC 中将其设置为“ bar@example.com”,则会npm config list报告如下内容:
; cli configs
user-agent = "npm/3.10.8 node/v6.9.1 win32 x64"
; userconfig C:\path\to\another\directory\.npmrc
(... other properties ...)
email = "foo@example.com"
(... other properties ...)
userconfig = "C:\path\to\another\directory\.npmrc"
; builtin config undefined
; node bin location = C:\Program Files\nodejs\node.exe
; cwd = C:\
; HOME = C:\Users\MyUsername …Run Code Online (Sandbox Code Playgroud) 我对 Java 8 还很陌生,所以这个问题可能有一个明显的答案,但在阅读了其他类似的 SO 问题后,我找不到任何导致我的问题的相似之处。
这是我的班级:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class LocalDateTimeIssue {
public static void main(String[] args) {
String dateTimeString = "18-04-2019 12:14:46";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm:ss", Locale.US);
LocalDateTime ldt = LocalDateTime.parse(dateTimeString , dtf);
System.out.println(ldt.getSecond());
}
}
Run Code Online (Sandbox Code Playgroud)
这会引发以下异常:
Exception in thread "main" java.time.format.DateTimeParseException: Text '18-04-2019 12:14:46' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MilliOfSecond=0, MinuteOfHour=14, HourOfAmPm=0, NanoOfSecond=0, MicroOfSecond=0, SecondOfMinute=46},ISO resolved to 2019-04-18 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
at java.time.LocalDateTime.parse(LocalDateTime.java:492) …Run Code Online (Sandbox Code Playgroud) 我正在开发一个将在 Windows 和 Mac 环境中执行的 Java 程序。我个人在 Windows 上。我让我的同事在 macOS 11.4 上测试 JAR 并且它可以工作,但是我们正在尝试使用一个脚本来避免键入java -jar lfm.jar. JAR 有各种各样的任务,这里最重要的是maplog,所以语法就是java -jar lfm.jar maplog [directoryname]. 所以这是我非常简单的脚本maplog.sh:
#!/bin/sh
java -jar lfm.jar maplog "$@"
Run Code Online (Sandbox Code Playgroud)
所以你应该能够做到sh maplog.sh [directoryname],它的结果与java -jar lfm.jar maplog [directoryname]. (顺便说一句,我确实在 Windows 上使用 Bash 进行了测试,效果很好。)但我们发现,在 macOS 上,使用脚本传递时,即使使用绝对路径,文件也会报告为不存在。
这是我的 Java 11 代码的相关部分(为简洁起见,删除了各种不相关或错误处理的内容):
#!/bin/sh
java -jar lfm.jar maplog "$@"
Run Code Online (Sandbox Code Playgroud)
这是我的同事运行此代码时的输出(我只编辑了他们的用户名和主机名,我已经检查过它们是相同的,而不是问题的原因 - 另请注意,他们的用户名不包含任何空格):
基本上,查询的路径是完全一样的,但是根据你是否通过脚本运行它会得到不同的结果。
最后,我的同事发现对脚本的修改有效
#!/bin/sh
echo $(java -jar lfm.jar maplog "$@")
Run Code Online (Sandbox Code Playgroud)
这现在可以正常工作并正确地发现文件存在。但是我仍然不知道为什么原始解决方案不起作用以及为什么这个修改后的解决方案有效。也许如果我更好地理解它,我可以找到更好的解决方案。
java ×9
spring ×3
spring-boot ×2
aggregator ×1
annotations ×1
file ×1
filter ×1
java-7 ×1
java-8 ×1
java-time ×1
junit ×1
logback ×1
logging ×1
macos ×1
mocking ×1
node.js ×1
npm ×1
partial ×1
properties ×1
reflection ×1
shell ×1
spring-mvc ×1
stack-trace ×1
unit-testing ×1