You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:25:20