当尝试注入一个 时Optional<T>,Spring 从不调用我的 bean,而是注入一个Optional.empty().
这是一些示例代码:
@Configuration
public class Initialize {
@Value("optionalValue")
private String testString;
@Bean (name = "getOptionalString")
public Optional<String> getOptionalString() {
return Optional.of(this.testString); //breakpoint put here, is never called
}
}
@Component
public class Test {
public Test(@Qualifier("getOptionalString") Optional<String> optional) {
// optional's value is Optional.empty() here
}
Run Code Online (Sandbox Code Playgroud)
我注意到(通过设置断点)@Bean永远不会被调用。如果我删除Optional<String>,并简单地返回String,那么它就可以了!
我知道Spring有它自己的可选依赖项,但我很困惑为什么这不起作用(无论我在网上读到的内容都说它应该),而且我也不明白它是如何将其初始化为Optional.empty()?
假设我想要INSERT INTO一个静态配置单元分区,我可以用 来实现吗Presto?
该PARTITION关键字仅适用于 hive。
INSERT INTO TABLE Employee PARTITION (department='HR')
Run Code Online (Sandbox Code Playgroud)
引起原因:com.facebook.presto.sql.parser.ParsingException:第 1:44 行:输入“PARTITION”不匹配。期望:'(',位于 com.facebook.presto.sql.parser.ErrorHandler.syntaxError(ErrorHandler.java:109)
我想测试我的 Spring Boot 命令行应用程序。我想模拟某些bean(我可以通过@ContextConfiguration(classes = TestConfig.class)在测试类顶部进行注释来做到这一点。在 中TestConfig.class,我重写了我想要模拟的bean。我想Spring Boot找到其余的组件。这似乎有效。
问题是,当我运行测试时,整个应用程序正常启动(即run()调用该方法)。
@Component
public class MyRunner implements CommandLineRunner {
//fields
@Autowired
public MyRunner(Bean1 bean1, Bean2 bean2) {
// constructor code
}
@Override
public void run(String... args) throws Exception {
// run method implementation
}
Run Code Online (Sandbox Code Playgroud)
我试图覆盖MyRunner @Bean并将其放入TestConfig.class,但这似乎不起作用。我知道我正在加载常规应用程序上下文,但这就是我想要做的(我认为?),因为我想重用@Component我在应用程序中创建的所有(或大部分)内容,并且仅模拟一个很小的子集。
有什么建议么?
编辑:
应用程序.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Run Code Online (Sandbox Code Playgroud) 我目前正在编写我的第一个 Spring 应用程序(Spring boot + hibernate)。我在这里查看了他们文档中的最佳实践目录结构。这说得通。
问题 1:
我有一个interface(或Abstract class) 几个子类扩展,所以我只需要一个@Repository父类。我决定这样做:
com
+- example
+- myapplication
+- Application.java
|
+- message
| +- AbstractMessage.java
| +- IMessageRepository.java
| +- MessageRepositoryImpl.java
+- messageTypeA
| +- messageTypeA.java
| +- messageTypeAService.java
+- messageTypeB
| +- messageTypeB.java
| +- messageTypeBService.java
Run Code Online (Sandbox Code Playgroud)
问题2:
现在我有一个新entity的保存名为Group. 所以我能做的就是添加一个Group与Message. 但是,这Group实际上是Message(例如,逻辑上)的一部分,因此如果它属于同一message目录的一部分实际上是有意义的(我们将它们保存为不同实体的唯一原因是因为以这种方式导出分析更有意义)。此外,我什至使用相同的方法MessageRepository来保存它(我只是在界面中添加了第二种方法,如下所示:)
public interface MessageRepository { …Run Code Online (Sandbox Code Playgroud) 考虑一下这段代码:
String baz = "Hello";
String foo = "Hello";
return foo.equals(baz); // Returns true as expected
return(baz == foo); // Also returns true!
Run Code Online (Sandbox Code Playgroud)
为什么==运算符在这种情况下也会返回true?应该比较对象本身的位置,而不是它们的值.
我假设Java做了某种内部工作,并确定这两个是类型String(或Integer等),所以它隐式调用该.equals()方法.
我很想知道这是如何完成的(即背景中发生了什么),以及为什么要这样做,如果我真的想在内存中测试它们的位置怎么办?
我刚刚开始测试。
我试图测试的方法没有返回值(void),但它在自己的类中创建了一个静态二维数组(char[][]),所以根据我的理解,这是它的副作用。
这是一些模拟代码:
public class MyClass{
public static char[][] table;
public void setTable(int rows, int columns, int number){
board = new char[n][m];
// more code that alters the table in a specific way,
// depending on the 3rd parameter
}
Run Code Online (Sandbox Code Playgroud)
现在为了测试,我正在考虑做类似的事情:
public class SetTableTest{
@Test
public void test(){
MyClass test = new MyClass();
assertArrayEquals(**********, test.table);
}
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
我是否可以像我一样与静态变量进行比较(test.table),即。这实际上会返回已完成表格的“实例”吗?
我相当确定二维数组没有assertArrayEquals等效项,那么我该如何解决这个问题呢?
考虑以下代码:(注意:为了代码清晰,删除了所有try/catch)
Object lock1 = new Object();
Object lock2 = new Object();
List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new ArrayList<Integer>();
public void process() {
for (int i = 0; i < 1000; i++) {
methodA();
methodB();
}
}
public void methodA() {
synchronized (lock1) {
Thread.sleep(1); // mimics other operations
list1.add(random.nextInt(100));
}
}
public void methodB() {
synchronized (lock2) {
Thread.sleep(1); // mimics other operations
list2.add(random.nextInt(100));
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设创建了2个线程,并且两个线程都只是调用process()它们的方法run().
假设当thread2尝试访问时,thread1 methodA()已经锁定了.根据我的理解,thread2将跳过同步锁定,退出methodA()和启动methodB …
我正在尝试将环境变量传递给我的 docker 容器。我的命令:
docker run my_app -e MY_CONFIG='/path/to/.env'
Run Code Online (Sandbox Code Playgroud)
给出:
Error: container_linux.go:370: starting container process caused: exec: "-e": executable file not found in $PATH: OCI not found
Run Code Online (Sandbox Code Playgroud)
这是 Dockerfile:
WORKDIR /app
ADD . /app
RUN pip3 install -r requirements.txt
CMD ["python", "main.py"]
Run Code Online (Sandbox Code Playgroud)
我无法在类似的上下文中找到这个问题。我是否误解了一个关键概念?