首页 > 解决方案 > @RequestParam 带有参数列表

问题描述

目标是发送一个 HTTP GET 请求,其中包含表示枚举值 QuestionSubject 的字符串列表,然后使用这些参数选择正确主题的问题。我还添加了一个自定义转换器来将接收到的字符串转换为我的枚举。我的问题是,当我在方法中进行调试时,“主题”始终为空。

这是我当前的 REST 端点:

@ResponseBody
@GetMapping(path = "question/getquestionsbysubjects")
public List<Question> loadQuestionsBySubjects(@RequestParam(required=false) QuestionSubject[] subjects) throws IOException, GeneralSecurityException {
   if(subjects == null || subjects.length == 0){
       return this.loadAllQuestions();
   }
   return questionRepository.findByQuestionSubjectIn(Arrays.asList(subjects));
}

在具有以下签名的方法中传递单个主题时,我能够得到我的问题:

public List<Question> loadQuestionsBySubjects(@RequestParam(required=false) QuestionSubject subject)

因此,将字符串转换为enum.

我尝试发送多个请求,但端点中的主题始终为空。这是我已经尝试过使用邮递员的方法:

http://localhost:8080/question/getquestionsbysubjects?subjects=contacts,ko
http://localhost:8080/question/getquestionsbysubjects?subjects=["contacts", "ko"]
http://localhost:8080/question/getquestionsbysubjects?subjects=contacts&subjects=ko

有我不知道的问题吗?这些似乎适用于我在其他问题中发现的内容。

这是转换器:

public class StringToQuestionSubjectConverter implements Converter<String, QuestionSubject> {
   @Override
   public QuestionSubject convert(String source) {
     return QuestionSubject.valueOf(source.toUpperCase());
   }

   public Iterable<QuestionSubject> convertAll(String[] sources) {
     ArrayList<QuestionSubject> list = new ArrayList<>();
        for (String source : sources) {
            list.add(this.convert(source));
        }
     return list;
    }
}

标签: spring-bootresthttppostman

解决方案


直接使用List

@RequestParam(required=false) List<QuestionSubject> subjects

return questionRepository.findByQuestionSubjectIn(subjects);

推荐阅读