Как сделать результат Json с помощью наследования JPA (весенняя загрузка)

#java #json #spring-boot #jpa #inheritance

Вопрос:

У меня есть ошибка в «findAll», когда я использую таблицы наследования JPA.

Я делаю результат Json таким [«asdf» : «adf», «asdf» : «asdf»]

но возвращаемые значения похожи на [com.example.model.Учетная запись@57af674a]

Контроллер

 @RequestMapping(value = "/getMyInfoall", produces = MediaType.APPLICATION_JSON_VALUE)
    public String getMemberall(@RequestBody JSONObject sendInfo) throws IOException {

        List user = UserService.findAll();
        
        JSONObject result = new JSONObject();
        result.put("data", user);

        return result.toJSONString();
    }
 

Обслуживание

 public List findAll() {
    List users = UserRepository.findAll();
    return users;
}
 

Хранилище

 @Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {
}
 

Сущность

 @Entity(name = "Users")
@Inheritance(strategy = InheritanceType.JOINED)
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private int userkey;

    @Column(nullable = false, unique = true)
    private String id;

    @Column(nullable = false, length = 50)
    private String name;

    @Column(nullable = false)
    private String password;

    @Column(nullable = true)
    private String email;
}

@Entity(name = "Account")
public class AccountEntity extends UserEntity{

    @Column(nullable = false, unique = true)
    private String accountno;

    @Column(nullable = true)
    private String accountname;

    @Column(nullable = false)
    private int accountpw;

    @Column(nullable = false)
    private long balance;
}```
 

Комментарии:

1. Что это за «asdf» : «adf», «asdf» : «asdf»? Это имя пользователя из таблицы пользователей?

2. [com.example.model.AccountEntity@57af674a] похоже List , что содержит один AccountEntity объект. Поскольку этот класс расширяется UserEntity , он может быть результатом вашего найденного списка, отформатированного в виде строки, т. Е. user.toString()

3. Можете ли вы уточнить, к чему относится ваш JSONObject? Класс Java JSONObject? Или класс, который вы создали? Мне кажется, что вернуть ваш объект UserEntity было бы проще, так как вы уже говорите Spring вернуть его как JSON.

Ответ №1:

Я бы настоятельно рекомендовал использовать Spring по умолчанию HTTPMessageConverter , например, Jackson для JSON.

Построение JSON-массива из списка

Но вы также можете использовать JSON.org легкая библиотека, такая как guided на JSON-java README:

  1. преобразуйте List в массив, например UserEntity[]
  2. создайте JSONArray из этого массива Java
  3. верните это представление JSON-массива в формате строки, используя метод toString()
 List<UserEntity> userList = // a list returned from your database/repo
UserEntity[] myArr = userList.toArray(new UserEntity[userList.size()]); // convert this to an array
// here simply follow the guide on JSON
JSONArray jArr = new JSONArray(myArr);
// return the JSON-array as string
return jArr.toString();
 

Ответ №2:

Вы должны преобразовать свои UserEntity объекты в UserDto DTO, который затем будет возвращен в ваш контроллер. Полагайтесь на Джексона, а JSONObject не на управляемого и созданного вами.

 public class UserDto {
    private String id;
    private String name;
}
 

Ваша служба должна выполнить сопоставление:

 public List<UserDto> findAll() {
    List<UserEntity> users = UserRepository.findAll();
    return users.stream().map(user -> // your mapping logic to UserDto object);
}
 

И вашему контроллеру просто нужно вернуть его:

 @RequestMapping(value = "/getMyInfoall", produces = MediaType.APPLICATION_JSON_VALUE)
public List<UserDto> getMemberall(@RequestBody JSONObject sendInfo) throws IOException {
    return UserService.findAll();
}
 

Вы можете сделать то же самое с JSONObject sendInfo ним и заменить его своим собственным объектом.