0

我正在处理三个不同的表。我正在使用 Hibernate 来查询这些表。我成功实现了 DAO 和服务层,但控制器包几乎没有问题。这是我的代码,我的控制器包包含 3 个类,每个类都应该处理一个表(如前所述,我有 3 个表)。

@Controller
public class Ods_Gis_Actel_Controller {

    Param_Gis_Actel_Controller Param = new Param_Gis_Actel_Controller();
    Tbl_Dim_Actel_Controller Dim = new Tbl_Dim_Actel_Controller();


    @Autowired
    Ods_Gis_Actel_metier service;

    @RequestMapping(value="/index")
    public String pageIndex(Model model)
    {   
        addOdsTable(model);
        Param.addParamTable(model);
        Dim.addDimTable(model);
        return "Affichage";
    }

    public void addOdsTable(Model model)
    {
        model.addAttribute("listeOds",service.getAll());
    }

}

@Controller
public class Param_Gis_Actel_Controller {

    @Autowired
    Param_Gis_Actel_metier service;

    public void addParamTable(Model model)
    { 
    model.addAttribute("listeParam",service.getAll());
    }

}




@Controller
public class Tbl_Dim_Actel_Controller {

    @Autowired
    Tbl_Dim_Actel_metier service;

    public void addDimTable(Model model)
    {
    model.addAttribute("listeDim",service.getAll());
    }

}

请求映射在第一个类中完成,其方法从其他类调用 2 个其他方法。但似乎自动装配仅在执行 RequestMapping 的类中有效。

这是真的?

如果自动装配对它们不起作用,我如何使用不包含 RequestMapping 的类中的其他方法?

4

3 回答 3

1

我解决了您的问题,我认为您不太了解 @Controller 和 @RequestMapping 的目标。所以首先你需要知道,为什么我们使用@Controller?,这是用来给你的请求提供业务逻辑的。当从 user 发出请求时,您的 DispatcherServlet 会将您的请求中的 url 与所有已定义控制器的 RequestMapping 注释的值相匹配。并据此调用匹配的映射方法,并由框架进行进一步处理。现在来到@Autowire,这是用来从xml配置中加载bean类定义的。所以 @Autowire 和 @RequestMapping 有不同的目标。所以在这里说

**autowiring** works only in the class where the RequestMapping is performed.

现在你的第二个问题,你如何使用简单的类?据我所知,有两种方法可以实现这一点,1)像您在代码中所做的那样在您的类中创建该类的对象 2)使用工厂方法创建该类的实例。

对于第二点,您必须首先按照以下格式在配置文件中定义您的类

<bean id="paramGis" class="<whatever_package_detail>.Param_Gis_Actel_Controller" factory-method="createInstance"/>

这里你必须关心的一件事是这个方法应该是静态的。

你的课看起来像这样

@Service
public class Param_Gis_Actel_Controller {


    private static Param_Gis_Actel_Controller  paramGis;

    public static Param_Gis_Actel_Controller createInstance(){
                 if(paramGis==null){
                       return new Param_Gis_Actel_Controller();
                 }
         return paramGis;
    }

    public void addParamTable(Model model)
    { 
    model.addAttribute("listeParam",service.getAll());
    }

}

如果您仍然遇到问题,请告诉我。

于 2013-07-29T09:27:30.160 回答
0

我认为您在使用 Java/Spring 方式时遇到了困难。我们不那样使用@Controller/@Autowired

这有点难以解释(我强烈建议您阅读官方文档),但简而言之,您不应该在另一个控制器中创建 Controller 对象。带有注释标记(@Controller@Service...)的对象应由 Spring 生成和管理。@Autowired在启动时,它们将通过“Spring”方式注入服务。当然,您可以通过其他特殊方法干预该过程。

P/s:您的命名约定不适用于 Java ;)。如果您创建一个供个人使用的程序,它可能没问题,但是您将很难与其他 Java 开发人员合作。

于 2013-07-29T09:31:56.193 回答
0

通过方法名称作为默认方法名称来访问该特定方法或使用 @Qualifier 注释。

于 2013-07-29T10:01:02.910 回答