Инициализация Java Spring, вызов метода при запуске

2

Я новичок в java spring framework, и я пытаюсь вызвать метод или инициализировать метод при запуске, поэтому, когда приложение запустится, я смогу увидеть свои данные из базы данных на моей странице jsp. Я попробовал @EventListener, @PostConstruct, но для меня ничего не работает.

Это мой класс WebConfigura

@Configuration
@ComponentScan("com.store.spring")
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {

@Bean
public DataSource dataSource() {
    final JndiDataSourceLookup lookup = new JndiDataSourceLookup();
    lookup.setResourceRef(true);
    DataSource dataSource = lookup.getDataSource("jdbc/product_db");

    return dataSource;
}

@Bean
public UrlBasedViewResolver resolver() {
    UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".jsp");
    viewResolver.setViewClass(JstlView.class);

    return viewResolver;
}

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("index");
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resource/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
}

@Override
public void configureDefaultServletHandling (DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new HeaderInterceptor());
}
}

Это класс инициатора веб-приложений

@Component
public class WebInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.register(WebConfiguration.class);
    // Add context.setCongiglocation("/WEB-INF/spring/dispatcher-config.xml");

    ServletRegistration.Dynamic registration = servletContext.addServlet("dispatcher", new DispatcherServlet(context));
    registration.addMapping("/");
    registration.setLoadOnStartup(1);

    ContextLoaderListener listener = new ContextLoaderListener(context);
    servletContext.addListener(listener);
}
}

Это класс контроллера

@Controller
public class ProductController {

@Autowired
private ProductService productService;

@RequestMapping("/index")
public String index(Model model) {
    List<Product> listProduct = productService.getPrducts();
    model.addAttribute("listProduct", listProduct);

    return "index";
}

// Request mapping using SQL tag
@RequestMapping("/location")
public String addLocation(Model model) {
    List<Product> listProduct = productService.getPrducts();
    model.addAttribute("listProduct", listProduct);

    return "location";
}

@RequestMapping("/entry")
public String entry() {
    return "Entry";
}

@RequestMapping("/aboutUs")
public String aboutUS() {return "AboutUs";}

@RequestMapping("/deal")
public String deal() {
    return "Deal";
}

@RequestMapping("/listProduct")
public String listOrganizationService(Model model) {
    List<Product> listProduct = productService.getPrducts();
    model.addAttribute("listProduct", listProduct);

    return "ListOrganizations";
}
}

Это класс перехватчика заголовка

public class HeaderInterceptor extends HandlerInterceptorAdapter {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
    request.setAttribute("title", "We hope you have a scary and fun filled halloween");
    String location = request.getParameter("locationName");
    if (location != null) {
        request.setAttribute("locationName", location);
    }
    return true;
}
}

Это метод, который я хочу инициализировать или вызвать при запуске. Или, по крайней мере, что-то близкое к этому

@RequestMapping("/index")
public String index(Model model) {
List<Product> listProduct = productService.getPrducts();
model.addAttribute("listProduct", listProduct);

return "index";
}

Я использую index.jsp для вызова listProduct для вывода моих данных. Обратите внимание, что index.jsp - это первый jsp, вызывающий при запуске приложения. И я хочу, чтобы он смог автоматически распечатать эти данные

<div class="main-container" style="text-align: center">
<c:forEach var="row" items="${listProduct}">
    <div class="detail">
        <td>ID: <c:out value="${row.id}"></c:out></td>
        <br/>
        <td>Name: <c:out value="${row.productName}"></c:out></td>
        <br/>
        <td>Quantity: <c:out value="${row.quantity}"></c:out></td>
        <br/>
        <td>Price: <c:out value="${row.price}"></c:out></td>
        <br/>
        <td><div class="few-line"><c:out value="${row.description}"></c:out></div></td>
    </div>
</c:forEach>

Надеюсь, кто-то может мне помочь.

Для примера у меня был этот код внутри моего класса WebInitializer, и когда я его запускал, я получил сообщение об ошибке

@EventListener(ContextRefreshedEvent.class)
public void contextRefreshedEvent(Model model) {
    List<Product> productList = productService.getPrducts();
    model.addAttribute("productList", productList)
}

Вызывается: java.lang.IllegalArgumentException: несоответствие типа аргумента в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) на sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) на sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl. java: 43) в java.lang.reflect.Method.invoke(Method.java:498) в org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:256)... еще 56 org.apache.catalina.core.StandardContext.startInternal Не удалось запустить один или несколько слушателей. org.apache.catalina.core.StandardContext.startInternal Context [] запуск не выполнен из-за предыдущих ошибок org.springframework.web.context.support.AnnotationConfigWebApplicationContext.doClose Закрытие корня WebApplicationContext: дата запуска [вс 13 авг 10:43:51 EDT 2017 ]; корень контекстной иерархии

Это мой штепсель и зависимости для моей банки

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <warSourceDirectory>WebContent</warSourceDirectory>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.3.10.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/jstl/jstl -->
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
</dependencies>
  • 2
    Добро пожаловать в переполнение стека! Я полагаю, что 95% этого кода не имеет отношения к вашей проблеме. Пожалуйста, создайте минимальный , полный и проверяемый пример, который демонстрирует вашу проблему.
  • 0
    «Ничто не работает для меня.» - Как это выглядит?
Теги:
jsp
spring
spring-mvc

1 ответ

0

Инициализация Java Spring, вызов метода при запуске

Вы можете аннотировать метод Spring bean с @PostConstruct чтобы Spring вызывал его после его создания. Вы также можете аннотировать метод с @Autowired чтобы Spring вызывал его во время построения этого компонента. Обычно мы используем один из них для вызова метода при запуске, например, для загрузки данных из базы данных в кеш.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню