Как я могу вернуть объект JSON без вложенных объектов из других классов? - PullRequest
0 голосов
/ 17 мая 2019

Я хочу вернуть объект 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 ]

0 голосов
/ 17 мая 2019

Если вы используете библиотеку Джексона, пожалуйста, отметьте @JsonUnwrapped. Документация здесь

Проблема в том, что @JsonUnwrapped не работает с коллекциями. Как вы указали в одном из ваших комментариев, если роль не обязательно должна быть сетом, это решит вашу проблему. Если у вас есть вопросы о том, почему @JsonUnwrapped не работает с Collcetions, это поможет понять в дальнейшем.

0 голосов
/ 17 мая 2019

Я думаю, вы могли бы просто сделать следующее.

@Projection(name = "CustomUser", types = {User.class})
public interface CustomUser {

    String getUsername();

    @Value("#{target.getRoles(0).getName()}") 
    String getRole();
}

Вы получаете роль -> структуру имени, потому что RoleTest является интерфейсом и может иметь несколько значений.

...