Почему серверная часть не может получить аргументы, отправленные внешним интерфейсом

Интерфейс отправляет данные в формате JSON, но серверная часть получает пустые данные. это отправка данных из внешнего интерфейса.

{
  "user": {
    "id": 0,
    "imgUrl": "default.jpg",
    "userName": "d",
    "password": "d",
    "email": "[email protected]"
  },
  "verification": "d"
}

это данные, полученные серверной частью. Это скриншот Debug в IDEA. Ожидается, что пользователь и проверка на рисунке получат данные из внешнего интерфейса, но Debug обнаруживает, что их значения равны нулю. Класс User определяется следующим образом

package com.example.back.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String userName;
    private String email;
    private String password;
    private Integer id;
    private String imgUrl;
    public User(String name,String password,String email){
        this.userName=name;
        this.password=password;
        this.email=email;
    }
}

Далее идет код, в котором возникла проблема.

@PostMapping("/signin")
public Message signIn( User user, String verification) {
     if (Boolean.TRUE.equals(redisTemplate.hasKey(user.getEmail())) && Boolean.TRUE.equals(redisTemplate.hasKey(verification))) {
         if (redisTemplate.opsForValue().get(user.getEmail()) == verification) {
             try {
                 userMapper.insert(user);
             } catch (DuplicateKeyException e) {
                 return Message.error("用户已注册");
             }
             user = userMapper.getByEmail(user.getEmail());
             String token = JWTUtils.generToken(user.getId());
             return Message.success("注册成功", token);
         }
     }
     return Message.error("验证码错误");
 }

Я попытался добавить @RequestParam к двум параметрам отдельно, чтобы это исправить, но безуспешно.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть 2 ошибки:

  1. Вас не хватает @RequestBody.
  2. Пользователь json и проверка являются частью другого объекта — json не соответствует тому, что вы анализируете в серверной части.
public class SignIn {

  private User user;
  private String verification;

  //getters and setters
}

В методе-обработчике:

@PostMapping("/signin")
public Message signIn(@RequestBody SignIn signIn) {
  ...
}

Действительно ли это эффективный и удобный способ создать отдельный класс для каждого интерфейса?

sleepawhile 10.07.2024 17:54

@sleepa while Я не совсем понимаю твой вопрос. Формат того, что вы отправляете из внешнего интерфейса, и объекта, который вы получаете на внутреннем интерфейсе, должен совпадать, и этого нельзя обойти. Если вы не хотите создавать класс, вам необходимо десериализовать в общее соответствие каждый объект — Map<String, Object>, что на самом деле является неподдерживаемым способом.

Chaosfire 10.07.2024 18:14

Другие вопросы по теме