2013-07-29 2 views
0

Я работаю над тремя разными таблицами. Я использую Hibernate для запроса этих таблиц. Я успешно реализовал DAO и уровни обслуживания, но у меня мало проблем с пакетом контроллера. Вот мой код, мой контрольный пакет содержит 3 класса, каждый должен обрабатывать таблицу (у меня есть 3 таблицы, как я уже говорил).Autowiring в классах без RequestMapping

@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()); 
    } 

} 

Отображение запроса выполняется в 1-й класс, метод которого требует 2 другие методы из других классов. Но кажется, что автоуведомление работает только в классе, где выполняется RequestMapping.

Это правда?

Как я могу использовать другие методы из классов, которые не содержат RequestMapping, если автоустановка не работает для них?

ответ

1

Я прошел через вашу проблему, я думаю, вы не так хорошо знаете цель @Controller, @RequestMapping. Итак, прежде всего вам нужно знать, почему мы используем @Controller ?, это используется для предоставления бизнес-логики по вашему запросу. Когда запрос запрашивается у пользователя, ваш DispatcherServlet соответствует URL-адресу вашего запроса для значения аннотации RequestMapping для всех определенных контроллеров. И в соответствии с этим метод сопоставления сопоставления называется и дальнейшим образом выполняется каркасом. Теперь переходим к @Autowire, это используется для загрузки определения класса bean из конфигурации xml. Таким образом, @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()); 
    } 

} 

Если вы все еще получаете проблему, дайте мне знать.

+0

Мой вопрос в ближайшее время - все атрибуты с @autwired аннотациями в моей программе, автоматически «автоматически» автоматически в любом классе моего пакета контроллера, даже если класс, содержащий атрибут, не обрабатывается Spring (я имею в виду вызов с весна на основе URL-адреса, который пользователь называет) – user2627156

0

Я думаю, что у вас возникают трудности с использованием Java/Spring. Мы не используем @Controller/@Autowired.

Это очень сложно объяснить (я настоятельно рекомендую вам прочитать official document), но, короче говоря, вы не должны создавать объект Controller внутри другого контроллера. Объекты с аннотациями (@Controller, @Service ...) должны создаваться и управляться весной. Во время инициации им будут введены услуги @Autowired по принципу «Весна». Из курсов вы можете вмешаться в этот процесс, но другими специальными методами.

P/s: ваше соглашение об именах не для Java;).Если вы создадите программу для личного использования, возможно, это нормально, но вам будет сложно сотрудничать с другими разработчиками Java.

+0

мой вопрос в ближайшее время, все атрибуты с @autwired аннотациями в моей программе «автоматически» автоматически в любом классе моего пакета контроллера, даже если класс, содержащий атрибут, не обрабатывается Spring (я имею в виду вызов с пружиной на основе URL-адреса, который пользователь называет) – user2627156

+0

@ user2627156: Думаю, вы ошиблись с моим ответом с Ашишем. Однако на ваш вопрос: я этого не понимаю. Шаг Autowiring не связан с пользовательскими вызовами URL - он создается, когда Spring запускает ваш компонент (скорее всего, когда начинается веб-приложение). Spring попытается выполнить аутоуверию к вашим объектам (Ods_Gis_Actel_Controller), но НЕ в объект Param_Gis_Actel_Controller внутри Ods_Gis_Actel_Controller. –

+0

Я вижу. Итак, все объекты с @autwired аннотацией инициализируются при запуске приложения (все они),? – user2627156

0

Посредством имени метода по умолчанию для доступа к этому конкретному методу или использования аннотаций @Qualifier.

Смежные вопросы