Spring Boot基于静态列表实现Postman数据收发(无数据库)
用静态列表存储并查询Spring Boot数据(无需数据库)
我是Spring Boot新手,想不使用数据库和Repository,通过静态列表存储Postman提交的问题数据,同时支持查询该列表数据,但不知道怎么实现。以下是我已编写的代码:
已实现代码
Controller类
@PostMapping public ResponseEntity<Object> createQuestion(@Valid @RequestBody CreateQuestionCommand command) { var query = new FindQuestionByIdTemp(command.getId()); var response = queryGateway.query(query, ResponseTypes.instanceOf(Object.class)).join(); if (response != null) { return new ResponseEntity<>(new QuestionCreatedResponse(command.getId(),"This id is already associated with other question"), HttpStatus.INTERNAL_SERVER_ERROR); } try { commandGateway.send(command); return new ResponseEntity<>(new QuestionCreatedResponse(command.getId(), "Question Created successfully!"), HttpStatus.CREATED); } catch (Exception e) { var safeErrorMessage = "Error while processing create question request for id - " + command.getId(); System.out.println(e.toString()); return new ResponseEntity<>(new QuestionCreatedResponse(command.getId(), safeErrorMessage), HttpStatus.INTERNAL_SERVER_ERROR); } }
CreateQuestionCommand类
public class CreateQuestionCommand { @AggregateIdentifier private String id; private Questions question; }
Questions类
public class Questions { @Id private String id; private String title; private String label; private String feedback; }
聚合类QuestionAggregateClass
@Aggregate public class QuestionAggregateClass { @AggregateIdentifier private String id; private Questions questions; public QuestionAggregateClass() { } @CommandHandler public QuestionAggregateClass(CreateQuestionCommands command) { var newQuestion=command.getQuestions(); newQuestion.setId(command.getId()); var event = QuestionCreatedEvents.builder() .id(command.getId()) .questions(newQuestion) .build(); AggregateLifecycle.apply(event); } @EventSourcingHandler public void on(QuestionCreatedEvents event){ this.id=event.getId(); this.questions=event.getQuestions(); } }
待完善的QuestionDataAsList类
public class QuestionDataAsList { public static List<Questions> questions; public static void save(Questions questions) { } }
事件处理器QuestionEventHandlerImp
@Component public class QuestionEventHandlerImp implements QuestionEventHandler{ @Override public void on(QuestionCreatedEvents event) { QuestionDataAsList.save(event.getQuestions()); } }
解决方案
1. 完善QuestionDataAsList的save方法
先初始化静态列表避免空指针,再用Lambda表达式实现保存逻辑(含重复ID校验):
import java.util.ArrayList; import java.util.List; import java.util.Optional; public class QuestionDataAsList { // 初始化静态列表,若需线程安全可替换为CopyOnWriteArrayList public static List<Questions> questions = new ArrayList<>(); public static void save(Questions question) { // 用Lambda+Stream校验ID是否已存在 Optional<Questions> existing = questions.stream() .filter(q -> q.getId().equals(question.getId())) .findFirst(); if (existing.isEmpty()) { questions.add(question); } // 可选:若ID重复可添加日志或抛出异常 } }
2. 实现查询功能
在QuestionDataAsList中添加基于Lambda的查询方法:
// 根据ID查询单个问题 public static Optional<Questions> findById(String id) { return questions.stream() .filter(q -> q.getId().equals(id)) .findFirst(); } // 查询所有问题(返回副本避免外部修改原列表) public static List<Questions> findAll() { return new ArrayList<>(questions); } // 可选:根据标题模糊查询 public static List<Questions> findByTitleContaining(String keyword) { return questions.stream() .filter(q -> q.getTitle().toLowerCase().contains(keyword.toLowerCase())) .toList(); }
3. 在Controller中添加查询接口
新增GET接口调用静态列表的查询方法:
// 根据ID查询问题 @GetMapping("/{id}") public ResponseEntity<Object> getQuestionById(@PathVariable String id) { Optional<Questions> question = QuestionDataAsList.findById(id); return question.map(q -> new ResponseEntity<>(q, HttpStatus.OK)) .orElseGet(() -> new ResponseEntity<>("Question with id " + id + " not found", HttpStatus.NOT_FOUND)); } // 查询所有问题 @GetMapping public ResponseEntity<List<Questions>> getAllQuestions() { return new ResponseEntity<>(QuestionDataAsList.findAll(), HttpStatus.OK); }
4. 关键注意事项
- 给
Questions类添加getter和setter方法,否则JSON序列化/反序列化会失败(Postman提交数据无法解析)。 - 静态列表是内存存储,应用重启后数据会丢失,符合无数据库的设计预期。
- 多线程场景下,将
ArrayList替换为CopyOnWriteArrayList保证线程安全。
内容的提问来源于stack exchange,提问作者Mahrukh Ahmad
相关产品推荐
相关产品推荐

