1

Spring MVC 3.1でRESTful APIを作成しています。ごとに一意のデータベースがあるため、REST URL に含める必要があるため、接続先のデータベースがわかります。 ProjectCollectionProject

私は自動的に魔法のように解決するために使用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));
            }
        });
    }   

}
4

0 に答える 0