Lưu ý: Đây là câu trả lời chính tắc cho một vấn đề chung.
Tôi có một @Service
lớp Spring ( MileageFeeCalculator
) có một @Autowired
trường ( rateService
), nhưng trường là null
khi tôi cố gắng sử dụng nó. Các bản ghi cho thấy rằng cả MileageFeeCalculator
bean và MileageRateService
bean đều đang được tạo, nhưng tôi nhận được NullPointerException
bất cứ khi nào tôi cố gắng gọi mileageCharge
phương thức trên service bean của mình. Tại sao Spring không tự động kích hoạt trường?
Lớp điều khiển:
@Controller
public class MileageFeeController {
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
MileageFeeCalculator calc = new MileageFeeCalculator();
return calc.mileageCharge(miles);
}
}
Hạng dịch vụ:
@Service
public class MileageFeeCalculator {
@Autowired
private MileageRateService rateService; // <--- should be autowired, is null
public float mileageCharge(final int miles) {
return (miles * rateService.ratePerMile()); // <--- throws NPE
}
}
Đậu dịch vụ nên được tự động tải MileageFeeCalculator
nhưng nó không được:
@Service
public class MileageRateService {
public float ratePerMile() {
return 0.565f;
}
}
Khi tôi cố gắng GET /mileage/3
, tôi nhận được ngoại lệ này:
java.lang.NullPointerException: null
at com.chrylis.example.spring_autowired_npe.MileageFeeCalculator.mileageCharge(MileageFeeCalculator.java:13)
at com.chrylis.example.spring_autowired_npe.MileageFeeController.mileageFee(MileageFeeController.java:14)
...
Trường được chú thích @Autowired
là null
do Spring không biết về bản sao của trường MileageFeeCalculator
mà bạn đã tạo new
và không biết cách tự động truyền tải nó.
Vùng chứa Spring Inversion of Control (IoC) có ba thành phần logic chính: sổ đăng ký (được gọi là ApplicationContext
) của các thành phần (bean) có sẵn để ứng dụng sử dụng, hệ thống cấu hình đưa các phụ thuộc của đối tượng vào chúng bằng cách khớp các phụ thuộc với bean trong ngữ cảnh và một bộ giải phụ thuộc có thể xem xét cấu hình của nhiều bean khác nhau và xác định cách khởi tạo và cấu hình chúng theo thứ tự cần thiết.
Vùng chứa IoC không phải là ma thuật và nó không có cách nào để biết về các đối tượng Java trừ khi bạn thông báo bằng cách nào đó về chúng. Khi bạn gọi new
, JVM tạo một bản sao của đối tượng mới và giao nó thẳng cho bạn - nó không bao giờ trải qua quá trình cấu hình. Có ba cách để bạn có thể cấu hình bean của mình.
Tôi đã đăng tất cả mã này, sử dụng Spring Boot để khởi chạy, tại dự án GitHub này ; bạn có thể xem toàn bộ dự án đang chạy cho từng cách tiếp cận để xem mọi thứ bạn cần để làm cho nó hoạt động. Gắn thẻ với NullPointerException
:nonworking
Tùy chọn thích hợp nhất là để Spring tự động chạy tất cả các bean của bạn; điều này yêu cầu số lượng mã ít nhất và dễ bảo trì nhất. Để làm cho autowiring hoạt động như bạn muốn, cũng autowire MileageFeeCalculator
như sau:
@Controller
public class MileageFeeController {
@Autowired
private MileageFeeCalculator calc;
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
return calc.mileageCharge(miles);
}
}
Nếu bạn cần tạo một phiên bản mới của đối tượng dịch vụ của mình cho các yêu cầu khác nhau, bạn vẫn có thể sử dụng tiêm bằng cách sử dụng phạm vi Spring bean .
Gắn thẻ hoạt động bằng cách chèn @MileageFeeCalculator
đối tượng dịch vụ:working-inject-bean
Nếu bạn thực sự cần các đối tượng được tạo new
để được tự động tải, bạn có thể sử dụng @Configurable
chú thích Spring cùng với quá trình dệt thời gian biên dịch AspectJ để đưa các đối tượng của bạn vào. Cách tiếp cận này chèn mã vào phương thức khởi tạo của đối tượng của bạn để cảnh báo Spring rằng nó đang được tạo để Spring có thể cấu hình phiên bản mới. Điều này yêu cầu một chút cấu hình trong bản dựng của bạn (chẳng hạn như biên dịch với ajc
) và bật trình xử lý cấu hình thời gian chạy của Spring ( @EnableSpringConfigured
với cú pháp JavaConfig). Cách tiếp cận này được sử dụng bởi hệ thống Roo Active Record để cho phép các new
cá thể của thực thể của bạn nhận được thông tin liên tục cần thiết được đưa vào.
@Service
@Configurable
public class MileageFeeCalculator {
@Autowired
private MileageRateService rateService;
public float mileageCharge(final int miles) {
return (miles * rateService.ratePerMile());
}
}
Thẻ hoạt động bằng cách sử dụng @Configurable
trên đối tượng dịch vụ:working-configurable
Cách tiếp cận này chỉ thích hợp để giao tiếp với mã kế thừa trong các tình huống đặc biệt. Việc tạo một lớp bộ điều hợp singleton mà Spring có thể tự động truyền tải và mã kế thừa có thể gọi, nhưng có thể hỏi trực tiếp bối cảnh ứng dụng Spring cho một bean.
Để làm điều này, bạn cần một lớp mà Spring có thể cung cấp một tham chiếu đến ApplicationContext
đối tượng:
@Component
public class ApplicationContextHolder implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static ApplicationContext getContext() {
return context;
}
}
Sau đó, mã kế thừa của bạn có thể gọi getContext()
và truy xuất các bean mà nó cần:
@Controller
public class MileageFeeController {
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
MileageFeeCalculator calc = ApplicationContextHolder.getContext().getBean(MileageFeeCalculator.class);
return calc.mileageCharge(miles);
}
}
Gắn thẻ hoạt động bằng cách tra cứu thủ công đối tượng dịch vụ trong ngữ cảnh Spring: working-manual-lookup
Nếu bạn không viết mã ứng dụng web, hãy đảm bảo rằng lớp của bạn mà @Autowiring được thực hiện là một hạt đậu mùa xuân. Thông thường, spring container sẽ không nhận biết được lớp mà chúng ta có thể nghĩ là một spring bean. Chúng ta phải nói với Spring container về các lớp học mùa xuân của chúng ta.
Điều này có thể đạt được bằng cách định cấu hình trong appln-contxt hoặc cách tốt hơn là chú thích lớp là @Component và vui lòng không tạo lớp được chú thích bằng toán tử mới. Đảm bảo rằng bạn lấy nó từ Appln-context như bên dưới.
@Component
public class MyDemo {
@Autowired
private MyService myService;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("test");
ApplicationContext ctx=new ClassPathXmlApplicationContext("spring.xml");
System.out.println("ctx>>"+ctx);
Customer c1=null;
MyDemo myDemo=ctx.getBean(MyDemo.class);
System.out.println(myDemo);
myDemo.callService(ctx);
}
public void callService(ApplicationContext ctx) {
// TODO Auto-generated method stub
System.out.println("---callService---");
System.out.println(myService);
myService.callMydao();
}
}
Trên thực tế, bạn nên sử dụng Đối tượng được quản lý bằng JVM hoặc Đối tượng được quản lý bằng mùa xuân để gọi các phương thức. từ mã trên của bạn trong lớp bộ điều khiển của bạn, bạn đang tạo một đối tượng mới để gọi lớp dịch vụ của bạn có một đối tượng có dây tự động.
MileageFeeCalculator calc = new MileageFeeCalculator();
vì vậy nó sẽ không hoạt động theo cách đó.
Giải pháp làm cho MileageFeeCalculator này trở thành một đối tượng có dây tự động trong chính Bộ điều khiển.
Thay đổi lớp Controller của bạn như bên dưới.
@Controller
public class MileageFeeController {
@Autowired
MileageFeeCalculator calc;
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
return calc.mileageCharge(miles);
}
}
Tôi đã từng gặp phải vấn đề tương tự khi tôi chưa quen với cuộc sống trong thế giới IoC . Cánh @Autowired
đồng của một trong những hạt đậu của tôi trống trong thời gian chạy.
Nguyên nhân gốc rễ là, thay vì sử dụng bean được tạo tự động được duy trì bởi vùng chứa Spring IoC (có @Autowired
trường thực sự được đưa vào đúng cách), tôi đang nhập new
phiên bản của riêng mình về loại bean đó và sử dụng nó. Tất nhiên @Autowired
trường này là trống vì Spring không có cơ hội để tiêm vào.
Vấn đề của bạn là mới (tạo đối tượng theo kiểu java)
MileageFeeCalculator calc = new MileageFeeCalculator();
Với chú thích @Service
, @Component
, @Configuration
đậu được tạo ra trong
bối cảnh ứng dụng của mùa xuân khi máy chủ được bắt đầu. Nhưng khi chúng ta tạo đối tượng bằng toán tử mới, đối tượng không được đăng ký trong ngữ cảnh ứng dụng đã được tạo. Đối với ví dụ lớp Employee.java tôi đã sử dụng.
Kiểm tra cái này:
public class ConfiguredTenantScopedBeanProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
String name = "tenant";
System.out.println("Bean factory post processor is initialized");
beanFactory.registerScope("employee", new Employee());
Assert.state(beanFactory instanceof BeanDefinitionRegistry,
"BeanFactory was not a BeanDefinitionRegistry, so CustomScope cannot be used.");
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
for (String beanName : beanFactory.getBeanDefinitionNames()) {
BeanDefinition definition = beanFactory.getBeanDefinition(beanName);
if (name.equals(definition.getScope())) {
BeanDefinitionHolder proxyHolder = ScopedProxyUtils.createScopedProxy(new BeanDefinitionHolder(definition, beanName), registry, true);
registry.registerBeanDefinition(beanName, proxyHolder.getBeanDefinition());
}
}
}
}
Tôi mới sử dụng Spring, nhưng tôi đã phát hiện ra giải pháp hiệu quả này. Xin vui lòng cho tôi biết nếu đó là một cách đáng trách.
Tôi làm cho Spring tiêm applicationContext
vào bean này:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@Component
public class SpringUtils {
public static ApplicationContext ctx;
/**
* Make Spring inject the application context
* and save it on a static variable,
* so that it can be accessed from any point in the application.
*/
@Autowired
private void setApplicationContext(ApplicationContext applicationContext) {
ctx = applicationContext;
}
}
Bạn cũng có thể đặt mã này trong lớp ứng dụng chính nếu muốn.
Các lớp khác có thể sử dụng nó như thế này:
MyBean myBean = (MyBean)SpringUtils.ctx.getBean(MyBean.class);
Bằng cách này, bất kỳ bean nào cũng có thể được lấy bởi bất kỳ đối tượng nào trong ứng dụng (cũng như trong ứng dụngnew
) và theo cách tĩnh .
Đó có vẻ là trường hợp hiếm gặp nhưng đây là những gì đã xảy ra với tôi:
Chúng tôi đã sử dụng @Inject
thay vì @Autowired
đó là tiêu chuẩn javaee được hỗ trợ bởi Spring. Mọi nơi nó hoạt động tốt và những hạt đậu được tiêm đúng cách, thay vì một nơi. Việc tiêm đậu có vẻ giống nhau
@Inject
Calculator myCalculator
Cuối cùng, chúng tôi phát hiện ra rằng lỗi là do chúng tôi (thực sự là tính năng tự động hoàn thành của Eclipse) đã nhập com.opensymphony.xwork2.Inject
thay vì javax.inject.Inject
!
Vì vậy, để tóm tắt, hãy chắc chắn rằng chú thích của bạn ( @Autowired
, @Inject
, @Service
, ...) có các gói đúng!
Nếu điều này đang xảy ra trong một lớp kiểm tra, hãy đảm bảo rằng bạn không quên chú thích lớp đó.
Ví dụ, trong Spring Boot :
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests {
....
Spring Boot tiếp tục phát triển . Nó không còn bắt buộc phải sử dụng @RunWith
nếu bạn sử dụng đúng phiên bản JUnit .
Để @SpringBootTest
làm việc độc lập, bạn cần sử dụng @Test
từ JUnit5 thay vì JUnit4 .
//import org.junit.Test; // JUnit4
import org.junit.jupiter.api.Test; // JUnit5
@SpringBootTest
public class MyTests {
....
Nếu bạn sai cấu hình này, các bài kiểm tra của bạn sẽ biên dịch, nhưng @Autowired
và @Value
các trường (ví dụ) sẽ như vậy null
. Vì Spring Boot hoạt động bằng phép thuật, bạn có thể có một số cách để gỡ lỗi trực tiếp lỗi này.
Tôi nghĩ rằng bạn đã bỏ lỡ việc hướng dẫn mùa xuân quét các lớp bằng chú thích.
Bạn có thể sử dụng @ComponentScan("packageToScan")
trên lớp cấu hình của ứng dụng mùa xuân của mình để hướng dẫn quét mùa xuân.
@Service, @Component
vv chú thích thêm mô tả meta.
Spring chỉ đưa các phiên bản của các lớp đó được tạo dưới dạng bean hoặc được đánh dấu bằng chú thích.
Các lớp được đánh dấu bằng chú thích cần được xác định bằng mùa xuân trước khi tiêm, @ComponentScan
hướng dẫn mùa xuân tìm kiếm các lớp được đánh dấu bằng chú thích. Khi Spring tìm thấy @Autowired
nó sẽ tìm kiếm bean liên quan và đưa vào phiên bản cần thiết.
Chỉ thêm chú thích, không sửa chữa hoặc tạo điều kiện cho việc tiêm phụ thuộc, Spring cần biết nơi để tìm.
Một giải pháp khác sẽ là đặt lệnh gọi:
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)
To MileageFeeCalculator constructor như thế này:
@Service
public class MileageFeeCalculator {
@Autowired
private MileageRateService rateService; // <--- will be autowired when constructor is called
public MileageFeeCalculator() {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)
}
public float mileageCharge(final int miles) {
return (miles * rateService.ratePerMile());
}
}
CẬP NHẬT: Những người thực sự thông minh đã nhanh chóng chỉ ra câu trả lời này , điều này giải thích sự kỳ lạ, được mô tả bên dưới
CÂU TRẢ LỜI GỐC:
Tôi không biết nó có giúp được ai không, nhưng tôi đã bị mắc kẹt với cùng một vấn đề ngay cả khi đang làm những việc có vẻ đúng. Trong phương thức Chính của tôi, tôi có một đoạn mã như sau:
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {
"common.xml",
"token.xml",
"pep-config.xml" });
TokenInitializer ti = context.getBean(TokenInitializer.class);
và trong một token.xml
tệp tôi có một dòng
<context:component-scan base-package="package.path"/>
Tôi nhận thấy rằng package.path không còn tồn tại nữa, vì vậy tôi đã bỏ dòng cho tốt.
Và sau đó, NPE bắt đầu xuất hiện. pep-config.xml
Tôi chỉ có 2 đậu:
<bean id="someAbac" class="com.pep.SomeAbac" init-method="init"/>
<bean id="settings" class="com.pep.Settings"/>
và lớp SomeAbac có thuộc tính được khai báo là
@Autowired private Settings settings;
vì một số lý do không xác định, cài đặt là null trong init (), khi <context:component-scan/>
phần tử không có ở tất cả, nhưng khi nó hiện diện và có một số bs làm basePackage, mọi thứ hoạt động tốt. Dòng này bây giờ trông như thế này:
<context:component-scan base-package="some.shit"/>
Và nó hoạt động. Có thể ai đó có thể cung cấp lời giải thích, nhưng đối với tôi bây giờ là đủ)
Đây là thủ phạm của việc tạo NullPointerException MileageFeeCalculator calc = new MileageFeeCalculator();
Chúng tôi đang sử dụng Spring - không cần tạo đối tượng theo cách thủ công. Việc tạo đối tượng sẽ do IoC container đảm nhận.
Bạn cũng có thể khắc phục sự cố này bằng cách sử dụng chú thích @Service trên lớp dịch vụ và chuyển lớp bean cần thiết làm tham số cho phương thức khởi tạo lớpB đậu khác và chú thích phương thức khởi tạo của classB bằng @Autowosystem. Đoạn mã mẫu ở đây:
@Service
public class ClassB {
private ClassA classA;
@Autowired
public ClassB(ClassA classA) {
this.classA = classA;
}
public void useClassAObjectHere(){
classA.callMethodOnObjectA();
}
}
Nói một cách đơn giản, chủ yếu có hai lý do để một @Autowired
trườngnull
LỚP CỦA BẠN KHÔNG PHẢI LÀ ĐẬU XUÂN.
LĨNH VỰC KHÔNG PHẢI LÀ ĐẬU.
Điều gì đã không được đề cập ở đây được mô tả trong này viết trong đoạn "Trình tự thực hiện".
Sau khi "học" rằng tôi phải chú thích một lớp với @Component hoặc các dẫn xuất @Service hoặc @Repository (tôi đoán có nhiều hơn nữa), để tự động truyền tải các thành phần khác bên trong chúng, tôi nhận ra rằng các thành phần khác này vẫn còn trống bên trong hàm tạo của thành phần mẹ.
Sử dụng @PostConstruct giải quyết được điều đó:
@SpringBootApplication
public class Application {
@Autowired MyComponent comp;
}
và:
@Component
public class MyComponent {
@Autowired ComponentDAO dao;
public MyComponent() {
// dao is null here
}
@PostConstruct
public void init() {
// dao is initialized here
}
}
Điều này chỉ hợp lệ trong trường hợp Unit test.
Lớp Dịch vụ của tôi có chú thích về dịch vụ và nó là @autowired
một lớp thành phần khác. Khi tôi kiểm tra lớp thành phần đã bị null. Vì đối với lớp dịch vụ, tôi đã tạo đối tượng bằng cách sử dụngnew
Nếu bạn đang viết unit test, hãy đảm bảo rằng bạn không tạo đối tượng bằng cách sử dụng new object()
. Thay vào đó, sử dụng injectionMock.
Điều này đã khắc phục sự cố của tôi. Đây là một liên kết hữu ích
Cũng lưu ý rằng nếu, vì bất kỳ lý do gì, bạn tạo một phương thức @Service
như final
, các bean tự động mà bạn sẽ truy cập từ nó sẽ luôn như vậy null
.
Không hoàn toàn liên quan đến câu hỏi, nhưng nếu trường chèn là null, thì phương thức tiêm dựa trên hàm tạo vẫn hoạt động tốt.
private OrderingClient orderingClient;
private Sales2Client sales2Client;
private Settings2Client settings2Client;
@Autowired
public BrinkWebTool(OrderingClient orderingClient, Sales2Client sales2Client, Settings2Client settings2Client) {
this.orderingClient = orderingClient;
this.sales2Client = sales2Client;
this.settings2Client = settings2Client;
}
Một trong những cách dưới đây sẽ hoạt động:
Lớp mà bạn đang sử dụng @Autowosystem không phải là Bean (Bạn có thể đã sử dụng new () ở đâu đó mà tôi chắc chắn).
Bên trong lớp SpringConfig, bạn chưa đề cập đến các gói mà Spring nên tìm kiếm @Component (Tôi đang nói về @ComponentScan (basePackages "tại đây"))
Nếu hai phần trên không hoạt động .... hãy bắt đầu đặt System.out.println () và tìm ra chỗ sai.
Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.
Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?
Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.
Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.
The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!
Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.
Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?
Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.
BoJack Horseman (Ảnh: Netflix) BoJack Horseman bắt đầu mùa thứ ba với sự xuất hiện của nhân vật tiêu biểu, người vẫn đang theo đuổi những lời khen ngợi từ giới phê bình trong một nỗ lực tuyệt vọng để tìm ra ý nghĩa trong cuộc sống của mình. Mùa thứ hai về số phận bi kịch của Raphael Bob-Waksberg dày đặc những trò đùa cũng như tuyệt vọng.
Bản nâng cấp Phiên bản 8.0 gần đây của Tesla đối với hệ thống Lái xe tự động được thiết kế để cải thiện hệ thống và mối quan hệ của nó với người lái.
Chắc chắn khi con cái chúng ta xem lại các chương trình chúng ta đã xem vào khoảng năm 2015, chúng sẽ thấy UnREAL, một chương trình truyền hình mới chiếu vào tối Thứ Hai của Lifetime — bạn sẽ thấy đúng lúc, sẽ phát sóng ngay sau khi The Bachelor kết thúc — như một chương trình không thể được thực hiện vào bất kỳ thời điểm nào khác trong lịch sử truyền hình, nhưng một chương trình cảm thấy cần thiết để xem bây giờ. UnREAL có sự tham gia của Shiri Appleby trong vai Rachel, một nhà sản xuất truyền hình cho một chương trình về cơ bản là The Bachelor, mặc dù trong thế giới này, nó được gọi là Vĩnh viễn.
Thông báo chính thức đến trực tiếp từ trang web của Star Wars: Fantastic Four, đạo diễn Josh Trank, một người bí ẩn không xuất hiện tại đại hội Star Wars Celebration gần đây, sẽ không chỉ đạo phần hai Star Wars Anthology. Đây là tuyên bố được đăng ngày hôm qua: Tất cả thực sự là ngôn ngữ rất lịch sự, nhưng một bài báo của Hollywood Reporter cho thấy tất cả đều không tốt ở hậu trường, gọi sự ra đi là "một vụ sa thải" một phần dựa trên "hành vi bất thường" của Trank trong khi quay Fantastic Four: The Bài báo trích dẫn các nguồn gọi là Trank “đôi khi thiếu quyết đoán và thiếu sáng tạo,” và lưu ý rằng Fantastic Four, khởi chiếu vào ngày 7 tháng 8, đã được khởi động lại vào cuối tháng 4.
McCain, người đang làm việc cho một album mới, lần đầu tiên bước vào vòng kết nối vào tối thứ Sáu ở Nashville
Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!
Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!
Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không
Đối với tôi, mọi thứ là về dòng đầu tiên đó và nó sẽ đưa bạn đến đâu. Một số nhà văn bị điều khiển bởi cốt truyện, sự sắp xếp tinh tế của các quân cờ, trong khi những người khác bị lôi cuốn bởi một nhân vật và khả năng thực hiện một cuộc hành trình với một người bạn hư cấu mới.
Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.
Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.
Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.