веб-запрос на передачу строки Java в не-строку @RequestParam - PullRequest
0 голосов
/ 08 января 2019

Я работаю над реактивным приложением, имеющим Java-бэкэнд. Реагирующий интерфейс отправляет запрос URL на контроллер веб-службы Java, и в этом контроллере веб-службы определяются типы переменных. Поскольку URL-запрос является строкой, у меня возникают проблемы при работе со нестроковыми значениями. А поскольку Javascript не является языком со строгой типизацией, таким как Java, я не могу определить типы переменных во внешнем интерфейсе.

Пример веб-запроса:

localhost:8080/filteredCSV.json?status=UNDER_ACTIVE_REVIEW,AUTHORIZED_BY_DWB,UNDER_CONSTRUCTION,CONSTRUCTION_COMPLETED&engineerEmail=null&issues=null&date=null

Контроллер веб-службы:

@RequestMapping(value = "/filteredCSV.json")
@ResponseBody
public WebserviceResponse<?>filteredCSV(
    @RequestParam(value="status") ArrayList status,                             
    @RequestParam(value="engineerEmail") ArrayList engineerEmail,
    @RequestParam(value="issues", required=false) Boolean issues,
    @RequestParam(value="date", required=false) Local Date date){

 return service.filteredCSV(status, engineerEmail, issues, date);
} 

Если значения Boolean или Date равны NULL, то значение NULL передается в виде строки, которая вызывает ошибку TypeMismatch, и программа останавливается. У меня, кажется, нет способа изменить строку на нестроковое нулевое значение, как только оно попадет в контроллер веб-службы. Я понимаю, почему это происходит, но я не уверен, есть ли способ обойти это так, чтобы я мог передать null как значение, а не null как строку. Я просто облажался? Разве нет способа справиться с этим?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Мне нравится предложение, опубликованное @zmf, однако, если вы хотите найти другие обходные пути. Пожалуйста, укажите некоторые подходы, которые, я думаю, будут работать:

Решение 1: Вы можете ввести фильтр и проанализировать все параметры запроса в виде строки. Когда вы встречаете ноль в качестве строки, не отправляйте параметр дальше, он будет считаться нулевым на уровне контроллера.

Решение 2. Замените тип RequestParam как Date, Boolean на String. Затем вы можете обрабатывать соответственно.

0 голосов
/ 08 января 2019

Вы не отправляете null как значение, вы отправляете строку, содержащую слово 'null.

Не отправлять значение "" вместо строкового значения 'null'. Это то, что ожидает @RequestParameter, когда должен игнорировать параметр.

@ RequestParameter docs

Если вы не можете редактировать javascript, у вас все еще есть некоторые опции ... что действительно делает Spring - это значения привязки данных из запроса http к экземплярам переменных Java. Вы можете переопределить или обойти это, как вам нужно. (Такой подход является «старым» способом сделать это, и именно эту проблему надеются решить весенние аннотации).

@RequestMapping(value = "/filteredCSV.json")
@ResponseBody
public WebserviceResponse<?>filteredCSV(HttpRequest request){
    String date = request.getParameter('date');
    // Convert date if not 'null' here, and so on
}
...