Spring MVC抽象コントローラの例

Spring MVC抽象コントローラーの例

自己参照のために、この記事では、Spring ControllerのAbstractクラス、またはテンプレートメソッドデザインパターンを作成する方法を示します。

1. 抽象コントローラー

抽象クラスでは、@Controllerアノテーションはオプションであり、実装されたクラスがそれを適用します。

AbstractResultController.java

package com.example.web.controller;

import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.example.web.generator.bo.ResultGenerator;

public abstract class AbstractResultController {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    abstract ResultGenerator GetResultGenerator();
    abstract String GetViewName();
    abstract Validator GetValidator();

    @RequestMapping(value = "/{q:.+}", method = RequestMethod.GET)
    final ModelAndView getModelAndView(@PathVariable("q") String q) {

        logger.debug("getModelAndView : [q] : {}", q);

        ModelAndView model = new ModelAndView();
        Map results = GetResultGenerator().getResultForController(q);
        model.addObject("data", results);
        model.setViewName(GetViewName());

        logger.debug("getModelAndView : [model] : {}", model);

        return model;

    }

}

2. スプリングコントローラーの拡張

一部のSpringコントローラーは、Abstractクラスとそれらに一致するURIパスを超えて拡張します。

2.1 Path = /hosting/{q:.+}

ResultControllerHosting.java

package com.example.web.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.example.web.generator.bo.ResultGenerator;

@Controller
@RequestMapping("/hosting")
public class ResultControllerHosting extends AbstractResultController {

    private static final String VIEW_NAME = "hosting";

    @Autowired
    @Qualifier("resultGeneratorHosting")
    ResultGenerator resultGenerator;

    @Override
    ResultGenerator GetResultGenerator() {
        return resultGenerator;
    }

    @Override
    String GetViewName() {
        return VIEW_NAME;
    }

}

2.2 Path = /site/{q:.+}

ResultControllerSite.java

package com.example.web.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.example.web.generator.bo.ResultGenerator;

@Controller
@RequestMapping("/site")
public class ResultControllerSite extends AbstractResultController {

    private static final String VIEW_NAME = "site";

    @Autowired
    @Qualifier("resultGeneratorSite")
    ResultGenerator resultGenerator;

    @Override
    ResultGenerator GetResultGenerator() {
        return resultGenerator;
    }

    @Override
    String GetViewName() {
        return VIEW_NAME;
    }

}

完了しました。