Springboot API返回空响应

时间:2018-04-18 08:39:38

标签: java hibernate spring-boot h2

我构建了一个简单的Springboot API,它连接到包含一些测试数据的H2 db。但是,当我点击API端点时,我得到一个空响应。

[{}]

当我调试我的应用程序时,控制器返回的用户对象包含我期望的用户。

Debugged user object

UserController.java

@RestController
@RequestMapping("api/user")
public class UserController {

    private UserService userService;

    public UserController(@Autowired UserService userService){
        this.userService = userService;
    }

    @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public Set<User> getAllUsers(){
        final Set<User> users = userService.getAllUsers();
        return users;
    }
}

UserRepo.java

public interface UserRepository extends CrudRepository<User, Long> {

    @Query("SELECT usr from User usr")
    Set<User> getAllUsers();
}

UserService.java

public interface UserService {

    Set<User> getAllUsers();
}

UserServiceImpl.java

@Service
public class UserServiceImpl implements UserService {

    private final UserRepository repository;

    public UserServiceImpl(@Autowired UserRepository userRepository){
        this.repository = userRepository;
    }

    @Override
    public Set<User> getAllUsers(){
        final Set<User> users = repository.getAllUsers();
        return users;
    }
}

User.java

@Entity
@Getter
public class User {

    @Id
    private Long id;
    private String username;
    private String firstname;
    private String lastname;
    private String email;
    private String role;
    private String premium;
}

3 个答案:

答案 0 :(得分:0)

这是一个相当奇怪的问题,我仍然无法确定。但是,删除lombok的@getter@setter批注,然后实施传统的批注,可以解决此问题。

答案 1 :(得分:0)

您必须将User的类成员设置为公共,以允许杰克逊序列化它们,即

// User.java
@Entity
public class User {
    @Id
    public Long id;
    public String username;
    public String firstname;
    public String lastname;
    public String email;
    public String role;
    public String premium;
}

注意:如果您不想序列化某个字段,请使用@JsonIgnore而不是将其设置为私有,例如<​​/ p>

@Entity
public class User {
    ...
    @JsonIgnore
    public String role;
    ...
}

答案 2 :(得分:-2)

只需删除final,然后将Set更改为List。 而你真的不需要这样做:

public UserController(@Autowired UserService userService)

只需删除此方法,然后将Autowired添加到userService归档。 因为最终对象不能转换为json字符串。 删除它:

produces = MediaType.APPLICATION_JSON_VALUE</h3>