Spring MVC 3.1でRESTful APIを作成しています。ごとに一意のデータベースがあるため、REST URL に含める必要があるため、接続先のデータベースがわかります。 Project
Collection
Project
私は自動的に魔法のように解決するために使用registerCustomEditor
しました(素晴らしい!) . @InitBinder
@PathVariable Project project
@PathVariable Collection collection
しかし、今は貪欲になり、このコントローラーの各アクションで同じことを何度も繰り返すのではなく、自動的に解決したいと考えています。問題は、解決されるCollection
かどうかにかかってProject
います。では、この依存関係をどのように設定すればよいでしょうか?
助けてくれてありがとう!!
@Controller
@RequestMapping(value = "/project/{project}/collection", produces = {"application/json", "application/xml"})
public class CollectionController {
private static final Logger log = LoggerFactory.getLogger(CollectionController.class);
@Autowired protected ProjectRepository projectRepository;
@Autowired protected CollectionService collectionService;
@Autowired protected PermissionService permissionService;
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody List<CollectionResponse> query(@ActiveAccount Account account, @PathVariable Project project) {
if (!permissionService.hasProjectAccess(account, project)) {
throw new AccessDeniedException("Access Denied");
}
CollectionRepository collectionRepository = collectionService.getCollectionRepository(project);
List<Collection> collections = collectionRepository.findByProjectId(project.getId());
List<CollectionResponse> response = new ArrayList<>();
for (Collection collection : collections) {
response.add(new CollectionResponse(collection));
}
return response;
}
@RequestMapping(value = "/{collection}", method = RequestMethod.GET)
public @ResponseBody CollectionResponse get(@ActiveAccount Account account, @PathVariable Project project, @PathVariable String collection) {
if (!permissionService.hasProjectAccess(account, project)) {
throw new AccessDeniedException("Access Denied");
}
CollectionRepository collectionRepository = collectionService.getCollectionRepository(project);
return new CollectionResponse(collectionRepository.findOne(collection));
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Project.class, new PropertyEditorSupport() {
@Override
public String getAsText() {
return ((Project) this.getValue()).getId();
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(projectRepository.findOne(text));
}
});
}
}