如何返回没有来自其他类的嵌套对象的JSON对象?

时间:2019-05-17 19:39:56

标签: java spring-data-jpa spring-projections

我想返回一个包含两个不同类信息的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 :(得分:0)

我认为您可以简单地执行以下操作。

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

    String getUsername();

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

您将获得角色->名称结构,因为RoleTest是一个接口,并且可能具有多个值。

答案 1 :(得分:0)

如果您正在使用Jackson库,请检查@JsonUnwrapped。该文档为here

这里的问题是@JsonUnwrapped不适用于Collections。正如您在其中一个注释中指出的那样,如果“角色”不必为一组,这将解决您的问题。 如果您对@JsonUnwrapped为什么不适用于Collcetions存有疑问,this将有助于进一步了解。