Как вернуть объект JSON без вложенных объектов из других классов?
Я хочу вернуть объект JSON с информацией из двух разных классов. Как я хочу, чтобы имя пользователя из класса User и rolename
из класса Role
вместе в одном объекте JSON.
Мой текущий код:
@Entity
@DynamicUpdate
public class User {
private String username;
private String phone;
private String email;
private Set<Role> role;
}
@Entity
public class Role {
private int idRole;
private String name;
}
@Projection(name = "CustomUser", types = {User.class})
public interface CustomUser {
String getUsername();
RoleTest getRole();
interface RoleTest {
String getName();
}
}
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
List<CustomUser> findAllBy();
}
@Controller
@RequestMapping
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping
@ResponseStatus(HttpStatus.ACCEPTED)
public @ResponseBody List<CustomUser> getAllUsers() {
return userRepository.findAllBy();
}
}
Что я сейчас получаю:
{
"role": {
"name": "ADMIN"
},
"username": "test"
}
Однако моя цель - получить что-то вроде этого:
{
"role": "ADMIN",
"username": "test"
}
2 ответа
Если вы используете библиотеку Джексона, пожалуйста, проверьте @JsonUnwrapped. Документация здесь
Проблема в том, что @JsonUnwrapped не работает с коллекциями. Как вы указали в одном из ваших комментариев, если роль не обязательно должна быть сетом, это решит вашу проблему. Если у вас есть вопросы о том, почему @JsonUnwrapped не работает с Collcetions, это поможет понять в дальнейшем.
Я думаю, что вы могли бы просто сделать следующее.
@Projection(name = "CustomUser", types = {User.class})
public interface CustomUser {
String getUsername();
@Value("#{target.getRoles(0).getName()}")
String getRole();
}
Вы получаете структуру role -> name, потому что RoleTest является интерфейсом и может иметь несколько значений.