EzyFox: Bắt đầu tìm hiểu từ đâu để hiểu được cơ chế của spring?
Anh cho em hỏi nếu muốn hiểu cái core với flow ezyfox của anh thì em nên đọc repo nào trước anh nhỉ, Kiểu trước kia em hay thắc mắc vì sao @Component annotation ở spring thì giúp mình đăng kí lớp đó như là bean để được quản lý ở bên dứoi á. Nay em thấy opensource của anh có những thứ đó. Nên em muốn dùng và nghiên cứu thêm thử. Với em thấy có cái gamebox cũng rất hay ạ.
[Easyfox-server] null pointer Exception on user repo while trying to connect
So I watched the <a href="https://www.youtube.com/watch?v=aTZDSiiITBM&list=PLlZavoxtKE1IfKY7ohkLLyv6YkHMkvH6G&index=4">video</a> for the authentication with Ezyfox-server but I got an NullPointerException on UserRepo while I try to log in. I can't figure out why because I triple check my code and the video...
<p>
</p>
<p>
Here is my code:
</p>
<p>
</p>
<pre>
# entity/BullyUser:
@Getter
@Setter
@ToString
@EzyCollection
public class BullyUser {
@EzyId
int id;
String username;
String password;
}
# repo/BullyUserRepo:
@EzyRepository("userRepo")
public interface BullyUserRepo extends EzyMongoRepository<Long, BullyUser> {
}
# service/BullyUserService:
public interface BullyUserService {
void saveUser(BullyUser user);
BullyUser createUser(String username, String password);
BullyUser getUser(String username);
}
# service/impl/BullyUserServiceImpl:
@Setter
@EzySingleton("userService")
public class BullyUserServiceImpl implements BullyUserService {
@EzyAutoBind
private BullyUserRepo BullyUserRepo;
@Override
public void saveUser(BullyUser user) {
BullyUserRepo.save(user);
}
@Override
public BullyUser createUser(String username, String password) {
BullyUser user = new BullyUser();
user.setUsername(username);
user.setPassword(password);
BullyUserRepo.save(user);
return user;
}
@Override
public BullyUser getUser(String username) {
return BullyUserRepo.findByField("username", username);
}
}
// [PLUGIN]/controller/UserLoginController
@EzySingleton
@EzyEventHandler(USER_LOGIN)
public class UserLoginController extends EzyAbstractPluginEventController {
@EzyAutoBind
private WelcomeService welcomeService;
@EzyAutoBind
private BullyUserService userService;
@Override
public void handle(EzyPluginContext ctx, EzyUserLoginEvent event) {
logger.info("{} login in", welcomeService.welcome(event.getUsername()));
String username = event.getUsername();
String password = event.getPassword();
BullyUser user = userService.getUser(username);
if (user == null) {
logger.info("User {} does not exist, creating new user", username);
user = userService.createUser(username, password);
userService.saveUser(user);
}
}
}
</pre>
Cách tạo mock ScheduledExecutorService cho EzyAppContext khi test
Em đang viết test cho issue <a href="https://github.com/youngmonkeys/ezyfox-server/issues/68">https://github.com/youngmonkeys/ezyfox-server/issues/68</a>. Em dùng Mockito để khởi tạo EzyAppContext: <code class="markdown-inline">EzyAppContext appContext = mock(EzyAppContext.class)</code>. Nhưng làm vậy <code class="markdown-inline">context.get(ScheduledExecutorService.class)</code> trả về <code class="markdown-inline">null</code>:
<p>
</p>
<img class="alignnone size-full wp-image-326" src="https://stackask.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-30-at-16.52.13-1.png" alt="" />
<p>
</p>
<p>
Cho em hỏi nên khởi tạo EzyAppContext như nào ạ?
</p>
[ezyfox-server] Chạy test EzySimpleAppEntryTest bị exception!
Em đã import ezyfox-server thành công, nhưng khi chạy thử <code>ezyfox-server/ezyfox-server-support/src/test/java/com/tvd12/ezyfoxserver/support/test/entry/EzySimpleAppEntryTest.java</code> thì bị exception, mặc dù test vẫn passed. Anh giải thích chỗ này giúp em với ạ.
<p>
</p>
<p>
Full log:
</p>
<pre>19:58:31,683 DEBUG [main] impl.EzyObjectWriterElementsFetcher - start scan class com.tvd12.ezyfoxserver.support.test.entry.ClientNoUserRequestHandler
19:58:31,695 DEBUG [main] impl.EzyObjectWriterElementsFetcher - scan field session
19:58:31,695 DEBUG [main] impl.EzyObjectWriterElementsFetcher - field session has not getter/setter, ignore it
19:58:31,695 DEBUG [main] impl.EzyObjectWriterElementsFetcher - scan field logger
19:58:31,696 DEBUG [main] impl.EzyObjectWriterElementsFetcher - field logger has not getter/setter, ignore it
19:58:31,696 DEBUG [main] impl.EzyObjectWriterElementsFetcher - finish scan class com.tvd12.ezyfoxserver.support.test.entry.ClientNoUserRequestHandler
19:58:31,851 DEBUG [main] impl.EzyObjectWriterBuilder - class com.tvd12.ezyfoxserver.support.test.entry.ClientNoUserRequestHandler$EzyObjectWriter$EzyAutoImpl$1 has generated
19:58:31,852 DEBUG [main] impl.EzyObjectWriterElementsFetcher - start scan class com.tvd12.ezyfoxserver.support.test.entry.ClientChatRequestHandler
19:58:31,853 DEBUG [main] impl.EzyObjectWriterElementsFetcher - scan field user
19:58:31,853 DEBUG [main] impl.EzyObjectWriterElementsFetcher - field user has not getter/setter, ignore it
19:58:31,853 DEBUG [main] impl.EzyObjectWriterElementsFetcher - scan field session
19:58:31,857 DEBUG [main] impl.EzyObjectWriterElementsFetcher - field session has not getter/setter, ignore it
19:58:31,857 DEBUG [main] impl.EzyObjectWriterElementsFetcher - scan field logger
19:58:31,857 DEBUG [main] impl.EzyObjectWriterElementsFetcher - field logger has not getter/setter, ignore it
19:58:31,857 DEBUG [main] impl.EzyObjectWriterElementsFetcher - finish scan class com.tvd12.ezyfoxserver.support.test.entry.ClientChatRequestHandler
19:58:31,860 DEBUG [main] impl.EzyObjectWriterBuilder - class com.tvd12.ezyfoxserver.support.test.entry.ClientChatRequestHandler$EzyObjectWriter$EzyAutoImpl$2 has generated
19:58:31,862 DEBUG [main] impl.EzyObjectWriterElementsFetcher - start scan class com.tvd12.ezyfoxserver.support.test.entry.ClientNoSessionRequestHandler
19:58:31,863 DEBUG [main] impl.EzyObjectWriterElementsFetcher - scan field logger
19:58:31,863 DEBUG [main] impl.EzyObjectWriterElementsFetcher - field logger has not getter/setter, ignore it
19:58:31,864 DEBUG [main] impl.EzyObjectWriterElementsFetcher - finish scan class com.tvd12.ezyfoxserver.support.test.entry.ClientNoSessionRequestHandler
19:58:31,868 DEBUG [main] impl.EzyObjectWriterBuilder - class com.tvd12.ezyfoxserver.support.test.entry.ClientNoSessionRequestHandler$EzyObjectWriter$EzyAutoImpl$3 has generated
19:58:32,348 DEBUG [main] impl.EzyByConstructorSingletonLoader - add singleton with name serverReadyEventHandler of class com.tvd12.ezyfoxserver.support.test.entry.ServerReadyEventHandler, object = com.tvd12.ezyfoxserver.support.test.entry.ServerReadyEventHandler@61d6015a
19:58:32,369 DEBUG [main] impl.EzyByConstructorPrototypeSupplierLoader - add prototype supplier of com.tvd12.ezyfoxserver.support.test.entry.ClientNoUserRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$1
19:58:32,372 DEBUG [main] impl.EzyByConstructorPrototypeSupplierLoader - add prototype supplier of com.tvd12.ezyfoxserver.support.test.entry.ClientNoDataBindingRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$2
19:58:32,377 DEBUG [main] impl.EzyByConstructorPrototypeSupplierLoader - add prototype supplier of com.tvd12.ezyfoxserver.support.test.entry.ClientBadRequestSendRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$3
19:58:32,380 DEBUG [main] impl.EzyByConstructorPrototypeSupplierLoader - add prototype supplier of com.tvd12.ezyfoxserver.support.test.entry.ClientBadRequestNoSendRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$4
19:58:32,383 DEBUG [main] impl.EzyByConstructorPrototypeSupplierLoader - add prototype supplier of com.tvd12.ezyfoxserver.support.test.entry.ClientAppRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$5
19:58:32,386 DEBUG [main] impl.EzyByConstructorPrototypeSupplierLoader - add prototype supplier of com.tvd12.ezyfoxserver.support.test.entry.ClientExceptionRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$6
19:58:32,389 DEBUG [main] impl.EzyByConstructorPrototypeSupplierLoader - add prototype supplier of com.tvd12.ezyfoxserver.support.test.entry.ClientChatRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$7
19:58:32,393 DEBUG [main] impl.EzyByConstructorPrototypeSupplierLoader - add prototype supplier of com.tvd12.ezyfoxserver.support.test.entry.ClientNoSessionRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$8
19:58:32,397 INFO [main] entry.EzySimpleAppEntryTest$EzyAppEntryEx - add event SERVER_READY controller com.tvd12.ezyfoxserver.support.test.entry.ServerReadyEventHandler@61d6015a
19:58:32,414 DEBUG [main] controller.EzyUserRequestAppPrototypeController$Builder - add command badRequestSend and request handler supplier com.tvd12.ezyfoxserver.support.test.entry.ClientBadRequestSendRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$3@72cde7cc
19:58:32,415 DEBUG [main] controller.EzyUserRequestAppPrototypeController$Builder - add command badRequestNoSend and request handler supplier com.tvd12.ezyfoxserver.support.test.entry.ClientBadRequestNoSendRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$4@5fd4f8f5
19:58:32,415 DEBUG [main] controller.EzyUserRequestAppPrototypeController$Builder - add command app and request handler supplier com.tvd12.ezyfoxserver.support.test.entry.ClientAppRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$5@4e7912d8
19:58:32,415 DEBUG [main] controller.EzyUserRequestAppPrototypeController$Builder - add command noSession and request handler supplier com.tvd12.ezyfoxserver.support.test.entry.ClientNoSessionRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$8@2f8dad04
19:58:32,416 DEBUG [main] controller.EzyUserRequestAppPrototypeController$Builder - add command exception and request handler supplier com.tvd12.ezyfoxserver.support.test.entry.ClientExceptionRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$6@53976f5c
19:58:32,416 DEBUG [main] controller.EzyUserRequestAppPrototypeController$Builder - add command noUser and request handler supplier com.tvd12.ezyfoxserver.support.test.entry.ClientNoUserRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$1@c333c60
19:58:32,416 DEBUG [main] controller.EzyUserRequestAppPrototypeController$Builder - add command chat and request handler supplier com.tvd12.ezyfoxserver.support.test.entry.ClientChatRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$7@2bfc268b
19:58:32,416 DEBUG [main] controller.EzyUserRequestAppPrototypeController$Builder - add command noDataBinding and request handler supplier com.tvd12.ezyfoxserver.support.test.entry.ClientNoDataBindingRequestHandler$EzyPrototypeSupplier$EzyAutoImpl$2@79da8dc5
19:58:32,791 WARN [main] controller.EzyUserRequestAppPrototypeController - has no handler with command: no command from session: null(owner: null, address: null)
19:58:32,815 ERROR [main] impl.EzySendResponseImpl - send data: [31, [1, [err, [1, test]]]], to client: null(owner: null, address: null) error
java.lang.NullPointerException
at com.tvd12.ezyfoxserver.command.impl.EzySendResponseImpl.execute(EzySendResponseImpl.java:41)
at com.tvd12.ezyfoxserver.context.EzySimpleServerContext.send(EzySimpleServerContext.java:89)
at com.tvd12.ezyfoxserver.command.impl.EzyAppSendResponseImpl.execute(EzyAppSendResponseImpl.java:30)
at com.tvd12.ezyfoxserver.context.EzySimpleAppContext.send(EzySimpleAppContext.java:52)
at com.tvd12.ezyfoxserver.context.EzyZoneChildContext.send(EzyZoneChildContext.java:25)
at com.tvd12.ezyfoxserver.support.controller.EzyUserRequestAppPrototypeController.responseError(EzyUserRequestAppPrototypeController.java:30)
at com.tvd12.ezyfoxserver.support.controller.EzyUserRequestAppPrototypeController.responseError(EzyUserRequestAppPrototypeController.java:10)
at com.tvd12.ezyfoxserver.support.controller.EzyUserRequestPrototypeController.handle(EzyUserRequestPrototypeController.java:66)
at com.tvd12.ezyfoxserver.support.controller.EzyUserRequestSingletonController.handle(EzyUserRequestSingletonController.java:60)
at com.tvd12.ezyfoxserver.support.controller.EzyUserRequestAppSingletonController.handle(EzyUserRequestAppSingletonController.java:8)
at com.tvd12.ezyfoxserver.support.test.entry.EzySimpleAppEntryTest.handleClientRequest(EzySimpleAppEntryTest.java:136)
at com.tvd12.ezyfoxserver.support.test.entry.EzySimpleAppEntryTest.test(EzySimpleAppEntryTest.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:598)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:824)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(ArrayList.java:1255)
at org.testng.TestRunner.privateRun(TestRunner.java:794)
at org.testng.TestRunner.run(TestRunner.java:596)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:377)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:332)
at org.testng.SuiteRunner.run(SuiteRunner.java:276)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1134)
at org.testng.TestNG.runSuites(TestNG.java:1063)
at org.testng.TestNG.run(TestNG.java:1031)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:73)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
19:58:32,820 DEBUG [main] controller.EzyUserRequestAppPrototypeController - request cmd: badRequestSend by session: null(owner: null, address: null) with data: [badRequestSend] error
com.tvd12.ezyfox.core.exception.EzyBadRequestException: test
at com.tvd12.ezyfoxserver.support.test.entry.ClientBadRequestSendRequestHandler.handle(ClientBadRequestSendRequestHandler.java:21)
at com.tvd12.ezyfoxserver.support.controller.EzyUserRequestPrototypeController.handle(EzyUserRequestPrototypeController.java:60)
at com.tvd12.ezyfoxserver.support.controller.EzyUserRequestSingletonController.handle(EzyUserRequestSingletonController.java:60)
at com.tvd12.ezyfoxserver.support.controller.EzyUserRequestAppSingletonController.handle(EzyUserRequestAppSingletonController.java:8)
at com.tvd12.ezyfoxserver.support.test.entry.EzySimpleAppEntryTest.handleClientRequest(EzySimpleAppEntryTest.java:136)
at com.tvd12.ezyfoxserver.support.test.entry.EzySimpleAppEntryTest.test(EzySimpleAppEntryTest.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:598)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:824)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(ArrayList.java:1255)
at org.testng.TestRunner.privateRun(TestRunner.java:794)
at org.testng.TestRunner.run(TestRunner.java:596)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:377)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:332)
at org.testng.SuiteRunner.run(SuiteRunner.java:276)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1134)
at org.testng.TestNG.runSuites(TestNG.java:1063)
at org.testng.TestNG.run(TestNG.java:1031)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:73)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
19:58:32,822 DEBUG [main] controller.EzyUserRequestAppPrototypeController - request cmd: badRequestNoSend by session: null(owner: null, address: null) with data: [badRequestNoSend] error
com.tvd12.ezyfox.core.exception.EzyBadRequestException: test
at com.tvd12.ezyfoxserver.support.test.entry.ClientBadRequestNoSendRequestHandler.handle(ClientBadRequestNoSendRequestHandler.java:21)
at com.tvd12.ezyfoxserver.support.controller.EzyUserRequestPrototypeController.handle(EzyUserRequestPrototypeController.java:60)
at com.tvd12.ezyfoxserver.support.controller.EzyUserRequestSingletonController.handle(EzyUserRequestSingletonController.java:60)
at com.tvd12.ezyfoxserver.support.controller.EzyUserRequestAppSingletonController.handle(EzyUserRequestAppSingletonController.java:8)
at com.tvd12.ezyfoxserver.support.test.entry.EzySimpleAppEntryTest.handleClientRequest(EzySimpleAppEntryTest.java:142)
at com.tvd12.ezyfoxserver.support.test.entry.EzySimpleAppEntryTest.test(EzySimpleAppEntryTest.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:598)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:824)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(ArrayList.java:1255)
at org.testng.TestRunner.privateRun(TestRunner.java:794)
at org.testng.TestRunner.run(TestRunner.java:596)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:377)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:332)
at org.testng.SuiteRunner.run(SuiteRunner.java:276)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1134)
at org.testng.TestNG.runSuites(TestNG.java:1063)
at org.testng.TestNG.run(TestNG.java:1031)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:73)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
===============================================
Default Suite
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
===============================================</pre>
[ezyfox-server] Làm sao để mở ezyfox-server bằng IntelliJ Idea?
Em đã import ezyfox-server vào IntelliJ nhưng các file test không chạy được. Các bước:
<p>
</p>
<ol start="1">
<li>Fork <code class="markdown-inline">ezyfox-server</code> về: <a href="https://github.com/vu-luong/ezyfox-server">https://github.com/vu-luong/ezyfox-server</a>
</li>
</ol>
<p>
</p>
<ol start="2">
<li>Import vào IntelliJ Idea
</li>
</ol>
<p>
</p>
<ol start="3">
<li>Set Sources Root:
</li>
</ol>
<p>
</p>
<img class="alignnone size-full wp-image-247" src="https://stackask.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-29-at-12.22.38.png" alt="" />
<p>
</p>
<ol start="4">
<li>Kết quả bị lỗi:
</li>
</ol>
<p>
</p>
<img class="alignnone size-full wp-image-248" src="https://stackask.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-29-at-12.23.10.png" alt="" />
[ezyfox-boot] packagesToScan bị rỗng
Mình tạo project bằng <code class="markdown-inline">ezyfox-server-archetype</code>, và dùng thư viện <code class="markdown-inline">ezyfox-boot-autoconfigure</code>, nhưng packagesToScan bị rỗng.
<p>
</p>
<img class="alignnone size-full wp-image-216" src="https://stackask.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-29-at-01.03.12.png" alt="" />
<p>
</p>
<p>
Source code: <a href="https://github.com/vu-luong/EzySmashers">https://github.com/vu-luong/EzySmashers</a>
</p>