【问题标题】:How can I Return a JSON Object without Nested Objects From Other Classes?如何在没有其他类的嵌套对象的情况下返回 JSON 对象?
【发布时间】:2019-05-17 19:39:56
【问题描述】:

我想返回一个带有来自两个不同类的信息的 JSON 对象。 就像我想将 User 类中的用户名和 Role 类中的 rolename 放在一个 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"
}

【问题讨论】:

  • 当用户拥有更多角色时应该输出什么?
  • 我想我不需要那个。是的,现在可能,但我必须改变它。这对我的问题有帮助吗?

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


【解决方案1】:

如果您使用的是 Jackson 库,请查看@JsonUnwrapped。文档是here

这里的问题是@JsonUnwrapped 不适用于集合。正如您在其中一个 cmets 中指出的那样,如果角色不需要是一组,这将解决您的问题。 如果您对为什么 @JsonUnwrapped 不适用于 Collcetions 有疑问,this 将有助于进一步理解。

【讨论】:

  • 最后,这对我有帮助。使用大量注释!
  • @m3kkasi,如果它解决了您的问题。你能把它标记为答案吗?
【解决方案2】:

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

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

    String getUsername();

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

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

【讨论】:

  • 如果我这样做,我会得到一个错误,因为 getRole() 不返回一个字符串而是一个角色。如果我编写 Role getRole(),我会再次在 json 对象中获得嵌套角色..
  • 够了。也许 getRole();方法需要计算吗?我在 get name 方法中添加了以下注释。 @Value("#{target.getRoles(0).getName()}") 我不知道它是否会起作用。但它可能会为您指明正确的方向。
猜你喜欢
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2022-08-06
相关资源
最近更新 更多