@ResponseBody returns 空对象
@ResponseBody returns empty object
当我使用下面的方法获取用户对象时,它工作得很好。
@GetMapping("/findOne")
@ResponseBody
public Optional<AppUser> findOne (Long id) {
return appUserRepository.findById(id);
}
上面给我的回复是:
{"id":1,"useruuid":"863db606-9af6-48a8-963a-07b9fe0fc4fc","useremail":"user1@mydomain.com"}
现在,我正在尝试使用以下方法基于 UUID(4) 进行搜索:
@GetMapping("/findOneUsingUUID")
@ResponseBody
public AppUser findOne (String useruuid) {
return appUserRepository.findByUseruuid(useruuid);
}
这没有 return 任何东西。没有错误,没有任何警告。虽然这为我提供了我需要的所有详细信息:
AppUser appUser = appUserRepository.findByUseruuid("863db606-9af6-48a8-963a-07b9fe0fc4fc");
System.out.println(" >>> " + appUser.getUseruuid());
System.out.println(" >>> " + appUser.getId());
System.out.println(" >>> " + appUser.getUseremail());
这是我存储库中的内容
@Repository
public interface AppUserRepository extends JpaRepository<AppUser, Long> {
AppUser findByUseruuid(String useruuid);
和实体
@NotEmpty
@Column(name = "useruuid")
@GenericGenerator(name = "uuid", strategy = "uuid4")
private String useruuid;
问题:
为什么我的控制器方法 @GetMapping("/findOneUsingUUID")
没有 returning 任何东西?任何相关的 info/help/link 将不胜感激。
更新(针对 sidgate 的 comment/question):
我在另一个控制器方法中测试了这个。像这样:
@RequestMapping(value = { "tableusers" }, method = RequestMethod.GET)
public String listUsers(ModelMap model) {
AppUser appUser = appUserRepository.findByUseruuid("863db606-9af6-48a8-963a-07b9fe0fc4fc");
System.out.println(" >>> " + appUser.getUseruuid());
System.out.println(" >>> " + appUser.getId());
System.out.println(" >>> " + appUser.getUseremail());
String tableusers = "tableusers";
model.addAttribute("tableusers", tableusers);
List<AppUser> users = appUserService.findAllUsers();
model.addAttribute("users", users);
model.addAttribute("metaTitle", "All Users");
return "user_table_data_table";
}
更新二:
现在我的控制器中有以下内容:
@RequestMapping(value = "/findOnebyId/{uuid}", method = RequestMethod.GET)
@ResponseBody
public AppUser findOneByUUID2(@PathVariable final String useruuid) {
return appUserRepository.findByUseruuid(useruuid);
}
所以我的 URL 变得类似于这样:
http://localhost:8080/findOnebyId?id=eeadf17f-13f2-4939-bab6-2534fcc1f4d4
但现在我的浏览器控制台出现 404 错误。
更新 3:
根据 Dale 的建议,我修复了它并将代码签入 github-repo。现在一切正常。
由于您在 AppUserRepository interface
中声明方法 findByUseruuid()
,因此您还需要提供将从 db 返回数据的查询。
例如:
@Repository
public interface AppUserRepository extends JpaRepository<AppUser, Long> {
@Query("select vm FROM table_name vm where vm.useruuid = :useruuid")
AppUser findByUseruuid(String useruuid);
其中 AppUser 是使用了正确注释的实体 class。
看来您需要修复您的控制器,您的函数 findOneByUUID 中缺少 @QueryParam
或 @PathParam
....需要添加如下所述
@GetMapping("/findOnebyId")
@ResponseBody
public AppUser findOneByUUID(@QueryParam("useruuid") String useruuid)
我根据您的 GitHub 代码进行了尝试,API 通过 Postman 为我完美地工作。问题可能出在您调用 API.
的方式上
您在评论部分提到您将值作为路径变量传递给控制器。但是您还没有在控制器方法中添加 @PathVariable
注释。所以控制器方法需要一个查询参数,而不是路径变量。请尝试通过传递 UUID 作为参数来调用 API。
编辑
查看您的 GitHub 代码,您将 API 称为 url: "/findOnebyId?id="+ id
。
@GetMapping("/findOnebyId")
@ResponseBody
public AppUser findOneByUUID(String useruuid) {
return appUserRepository.findByUseruuid(useruuid);
}
在此控制器方法中,您期望 useruuid
作为查询参数。但是在您的 datatables.html 文件中,您发送的查询参数为 id
.
因此您可以删除 @PathVariable
注释并更正 AJAX 请求中的查询参数名称。
当我使用下面的方法获取用户对象时,它工作得很好。
@GetMapping("/findOne")
@ResponseBody
public Optional<AppUser> findOne (Long id) {
return appUserRepository.findById(id);
}
上面给我的回复是:
{"id":1,"useruuid":"863db606-9af6-48a8-963a-07b9fe0fc4fc","useremail":"user1@mydomain.com"}
现在,我正在尝试使用以下方法基于 UUID(4) 进行搜索:
@GetMapping("/findOneUsingUUID")
@ResponseBody
public AppUser findOne (String useruuid) {
return appUserRepository.findByUseruuid(useruuid);
}
这没有 return 任何东西。没有错误,没有任何警告。虽然这为我提供了我需要的所有详细信息:
AppUser appUser = appUserRepository.findByUseruuid("863db606-9af6-48a8-963a-07b9fe0fc4fc");
System.out.println(" >>> " + appUser.getUseruuid());
System.out.println(" >>> " + appUser.getId());
System.out.println(" >>> " + appUser.getUseremail());
这是我存储库中的内容
@Repository
public interface AppUserRepository extends JpaRepository<AppUser, Long> {
AppUser findByUseruuid(String useruuid);
和实体
@NotEmpty
@Column(name = "useruuid")
@GenericGenerator(name = "uuid", strategy = "uuid4")
private String useruuid;
问题:
为什么我的控制器方法 @GetMapping("/findOneUsingUUID")
没有 returning 任何东西?任何相关的 info/help/link 将不胜感激。
更新(针对 sidgate 的 comment/question): 我在另一个控制器方法中测试了这个。像这样:
@RequestMapping(value = { "tableusers" }, method = RequestMethod.GET)
public String listUsers(ModelMap model) {
AppUser appUser = appUserRepository.findByUseruuid("863db606-9af6-48a8-963a-07b9fe0fc4fc");
System.out.println(" >>> " + appUser.getUseruuid());
System.out.println(" >>> " + appUser.getId());
System.out.println(" >>> " + appUser.getUseremail());
String tableusers = "tableusers";
model.addAttribute("tableusers", tableusers);
List<AppUser> users = appUserService.findAllUsers();
model.addAttribute("users", users);
model.addAttribute("metaTitle", "All Users");
return "user_table_data_table";
}
更新二:
现在我的控制器中有以下内容:
@RequestMapping(value = "/findOnebyId/{uuid}", method = RequestMethod.GET)
@ResponseBody
public AppUser findOneByUUID2(@PathVariable final String useruuid) {
return appUserRepository.findByUseruuid(useruuid);
}
所以我的 URL 变得类似于这样:
http://localhost:8080/findOnebyId?id=eeadf17f-13f2-4939-bab6-2534fcc1f4d4
但现在我的浏览器控制台出现 404 错误。
更新 3:
根据 Dale 的建议,我修复了它并将代码签入 github-repo。现在一切正常。
由于您在 AppUserRepository interface
中声明方法 findByUseruuid()
,因此您还需要提供将从 db 返回数据的查询。
例如:
@Repository
public interface AppUserRepository extends JpaRepository<AppUser, Long> {
@Query("select vm FROM table_name vm where vm.useruuid = :useruuid")
AppUser findByUseruuid(String useruuid);
其中 AppUser 是使用了正确注释的实体 class。
看来您需要修复您的控制器,您的函数 findOneByUUID 中缺少 @QueryParam
或 @PathParam
....需要添加如下所述
@GetMapping("/findOnebyId")
@ResponseBody
public AppUser findOneByUUID(@QueryParam("useruuid") String useruuid)
我根据您的 GitHub 代码进行了尝试,API 通过 Postman 为我完美地工作。问题可能出在您调用 API.
的方式上您在评论部分提到您将值作为路径变量传递给控制器。但是您还没有在控制器方法中添加 @PathVariable
注释。所以控制器方法需要一个查询参数,而不是路径变量。请尝试通过传递 UUID 作为参数来调用 API。
编辑
查看您的 GitHub 代码,您将 API 称为 url: "/findOnebyId?id="+ id
。
@GetMapping("/findOnebyId")
@ResponseBody
public AppUser findOneByUUID(String useruuid) {
return appUserRepository.findByUseruuid(useruuid);
}
在此控制器方法中,您期望 useruuid
作为查询参数。但是在您的 datatables.html 文件中,您发送的查询参数为 id
.
因此您可以删除 @PathVariable
注释并更正 AJAX 请求中的查询参数名称。