我使用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 Boot启动类:
@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,那么为什么它不起作用?
答案 0 :(得分:1)
这不起作用,因为您使用的URL结构在Spring Data Rest上下文中已经具有含义。
/{repository}/{id}/{column}
URL是通过RepositoryPropertyReferenceController.followPropertyReference
方法处理的。
/api/users/1/nameOne
的意思是:获得ID为1的用户的nameOne
列。重要的注意事项是:此列应引用另一个@Entity
。这意味着,如果您有一个名为“姓”的String
列,并且点击了URL /api/users/1/name
,您将得到404,因为此列未引用另一个实体。如果您有一个名为school的列,它引用一个School
实体,并且您访问了URL /api/users/1/school
,那么您将获得该用户所引用的school实体。如果用户没有学校,那么您将再次获得404。
此外,如果您提供的URL与Spring Data Rest不冲突,则@RepositoryRestController
可用于@RequestMapping
。
您可以使用以下示例进行测试:
@RepositoryRestController
public class CustomRepositoryRestController {
@RequestMapping(path = "/repositoryRestControllerTest", method = RequestMethod.GET)
@ResponseBody
public String nameOne() {
return "test";
}
}
访问http://localhost:8080/repositoryRestControllerTest
我希望这个解释为您澄清一切。
答案 1 :(得分:0)
如果localhost:8080/api
是您的根上下文,则localhost:8080/api/users/1/nameOne
应该是您用于用户GET的URL。