无法理解为什么 RepositoryRestController 不起作用?
Cant understand why RepositoryRestController does not work?
我使用 Spring Data Rest,我不明白为什么我的 RepositoryRestController 不起作用。它的代码:
@RepositoryRestController
public class Cntrl {
@Autowired
private UserDao userDao;
@RequestMapping(name = "/users/{id}/nameOne",method =
RequestMethod.GET)
@ResponseBody
public PersistentEntityResource setNameOne(@PathVariable("id") Long id, PersistentEntityResourceAssembler persistentEntityResourceAssembler){
User user = userDao.findById(id).orElseThrow(()->{
throw new ServerException("Wrong id");
});
user.setLogin("One");
userDao.save(user);
return persistentEntityResourceAssembler.toFullResource(user);
}
}
和Spring开机启动class:
@SpringBootApplication
@EnableWebMvc
@EnableScheduling
@EnableJpaRepositories
@EnableSpringDataWebSupport
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
当我转到基本路径 (localhost:8080/api) 时一切正常,但是当发送 GET 请求到 localhost:8080/api/users/1/nameOne 我得到空响应,我没有其他控制器,我有 ID 为 1 的用户,那么为什么它不起作用?
如果 localhost:8080/api
是您的根上下文,那么 localhost:8080/api/users/1/nameOne
应该是您用于用户 GET 的 url。
它不起作用,因为您正在使用的 URL 结构在 Spring Data Rest 上下文中已经有意义。
/{repository}/{id}/{column}
URL 在 RepositoryPropertyReferenceController.followPropertyReference
方法中处理。
/api/users/1/nameOne
表示:获取id为1的用户的nameOne
列。需要注意的是:该列应该引用另一个@Entity
。这意味着如果您有一个名为 "surname" 的 String
列并且您点击 URL /api/users/1/name
您将得到 404,因为该列没有引用另一个实体。如果您有一个名为 school 的列引用了 School
实体,并且您点击了 URL /api/users/1/school
,您将获得该用户引用的学校实体。如果用户没有学校那么你会再次得到 404。
此外,如果您提供的 URL 不与 Spring 数据剩余冲突,@RepositoryRestController
可用于 @RequestMapping
。
您可以使用以下示例进行测试:
@RepositoryRestController
public class CustomRepositoryRestController {
@RequestMapping(path = "/repositoryRestControllerTest", method = RequestMethod.GET)
@ResponseBody
public String nameOne() {
return "test";
}
}
访问http://localhost:8080/repositoryRestControllerTest
我希望这个解释能为您澄清一些事情。
我使用 Spring Data Rest,我不明白为什么我的 RepositoryRestController 不起作用。它的代码:
@RepositoryRestController
public class Cntrl {
@Autowired
private UserDao userDao;
@RequestMapping(name = "/users/{id}/nameOne",method =
RequestMethod.GET)
@ResponseBody
public PersistentEntityResource setNameOne(@PathVariable("id") Long id, PersistentEntityResourceAssembler persistentEntityResourceAssembler){
User user = userDao.findById(id).orElseThrow(()->{
throw new ServerException("Wrong id");
});
user.setLogin("One");
userDao.save(user);
return persistentEntityResourceAssembler.toFullResource(user);
}
}
和Spring开机启动class:
@SpringBootApplication
@EnableWebMvc
@EnableScheduling
@EnableJpaRepositories
@EnableSpringDataWebSupport
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
当我转到基本路径 (localhost:8080/api) 时一切正常,但是当发送 GET 请求到 localhost:8080/api/users/1/nameOne 我得到空响应,我没有其他控制器,我有 ID 为 1 的用户,那么为什么它不起作用?
如果 localhost:8080/api
是您的根上下文,那么 localhost:8080/api/users/1/nameOne
应该是您用于用户 GET 的 url。
它不起作用,因为您正在使用的 URL 结构在 Spring Data Rest 上下文中已经有意义。
/{repository}/{id}/{column}
URL 在 RepositoryPropertyReferenceController.followPropertyReference
方法中处理。
/api/users/1/nameOne
表示:获取id为1的用户的nameOne
列。需要注意的是:该列应该引用另一个@Entity
。这意味着如果您有一个名为 "surname" 的 String
列并且您点击 URL /api/users/1/name
您将得到 404,因为该列没有引用另一个实体。如果您有一个名为 school 的列引用了 School
实体,并且您点击了 URL /api/users/1/school
,您将获得该用户引用的学校实体。如果用户没有学校那么你会再次得到 404。
此外,如果您提供的 URL 不与 Spring 数据剩余冲突,@RepositoryRestController
可用于 @RequestMapping
。
您可以使用以下示例进行测试:
@RepositoryRestController
public class CustomRepositoryRestController {
@RequestMapping(path = "/repositoryRestControllerTest", method = RequestMethod.GET)
@ResponseBody
public String nameOne() {
return "test";
}
}
访问http://localhost:8080/repositoryRestControllerTest
我希望这个解释能为您澄清一些事情。