Konfiguracja spring mvc

0

Nie mogę zlokalizować błędu w konfiguracji a przy odpaleniu aplikacji dostaję HTTP Status 404 The requested resource is not available. Proszę o pomoc.
Zaznaczę, że zaczynam ze springiem a ta konfiguracja bazuje na tutorialach.
spring najnowszy jaki proponował maven - 4.0.4

plik app_config pusty

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/app-config.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/webapp-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>


</web-app> 

webapp-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    
    xsi:schemaLocation="http://www.springframework.org/schema/mvc 
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
                        http://www.springframework.org/schema/beans 
                        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
                        http://www.springframework.org/schema/context 
                        http://www.springframework.org/schema/context/spring-context-4.0.xsd
                        http://www.springframework.org/schema/tx 
                        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
    
    <mvc:annotation-driven />

    <mvc:resources mapping="/resources/**" location="/resources/" />

    <context:component-scan base-package="com.mojpakiet" />
    
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url"
            value="jdbc:mysql://localhost:3306/TEST" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>

    <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath" value="/WEB-INF/html/"/>
    </bean>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
        <property name="cache" value="true"/>
        <property name="prefix" value=""/>
        <property name="suffix" value=".html"/>
        <property name="exposeSpringMacroHelpers" value="true"/>
    </bean>
    
    <!-- Hibernate 4 SessionFactory Bean definition -->
    <bean id="hibernate4AnnotatedSessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>/ścieżka do encji/</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
                </prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>
 
    <tx:annotation-driven transaction-manager="transactionManager"/>
     
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
    </bean>

</beans> 

w kontrolerze z @RequestMapping("/")
mam metodę zwracającą "index"

@Controller
@RequestMapping("/")
public class IndexController {

    @RequestMapping
    public String getIndex() {
        return "index";
    }
}
0

ihmo nie chce spamować ale nie lepiej już używać java configu zamiast tony xmla ?

1

Ja wolę starego, poczciwego xml'a połączonego z adnotacjami :) Także to kwestia gustu.

0

Nie jestem specjalista, ale jeśli używasz Velocity nie powinieneś tworzyć strony z rozszerzeniem vm?

<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
        <property name="cache" value="true"/>
        <property name="prefix" value=""/>
        <property name="suffix" value=".vm"/>
        <property name="exposeSpringMacroHelpers" value="true"/>
    </bean>
0

A jak ustawisz prefix w view resolverze na

   <property name="prefix" value="/WEB-INF/html/"/>

?

0

Znalazłem rozwiązanie. Mam kilka pakietów zaczynających się od com.mojpakiet... było

 <context:component-scan base-package="com.mojpakiet" />

No i myślałem, że tak będzie dobrze, dodałem więc osobną taką linię dla każdego z pakietów, przykładowo :

 <context:component-scan base-package="com.mojpakiet.a" />
<context:component-scan base-package="com.mojpakiet.b" />
<context:component-scan base-package="com.mojpakiet.c" />
<context:component-scan base-package="com.mojpakiet.d" />

Ale dlaczego nie łapie wszystkich gdy podane jest com.mojpakiet? Chyba, że ma być podany tutaj tylko pakiet z kontrolerami?

0

Niemożliwe. Powinno łykać wszystko. Popatrz tu:
https://github.com/Pharisaeus/SpringScaffoldApplication
cudo to to nie jest, ale może cię natchnie porównanie z działajaca konfiguracją ;)

0

Zaraz jeszcze pokombinuje ale póki co cieszę się, że działa :D teraz mam inny problem wysyłam jsona z serwera ale nie wyświetla się lista na stronie, w konsoli jest błąd HTTP Status 406 - Not Acceptable.
Mam dodane dependency jacksona.
w kontrolerze:

@RequestMapping("filesList.json")
    public @ResponseBody List<MyFiles> getMyfilesList() {
        return filesService.getAllfiles(); // tutaj pobieram listę obiektów z dao za pośrednictwem serwisu
    }
0

A skonfigurowałeś poprawnie jacksona i serializacje do jsona? Poza tym Spring 4 na RestController ;) Znów: patrz projekt wyżej. Tam masz konfigurację do tego ;)

0
Shalom napisał(a):

Poza tym Spring 4 na RestController ;)

Żeby zmienić Controller na RestController? Nie widzę potrzeby tym bardziej, że mam na stronce na przykład tak, że mam listę linków i po kliknięciu jest zmieniany layout pod listą(nie wiem jak to lepiej opisać)

<ul >
        <li><a href="#/element1">test1</a></li>
        <li><a href="#/element2">test2</a></li>
        <li><a href="#/element3">test3</a></li>
    </ul>

i przykładowo


App.config(['$routeProvider', function ($routeProvider) {
    $routeProvider.when('/files', {
        templateUrl: 'files/layout',
        controller: FilesController
    });
}]);

a w kontrolerze

@RequestMapping("/layout")
    public String getFilesPartialPage() {
        return "files/layout";
    }

i layout jest elegancko podmieniany przy klikaniu na listę a gdy zmienię na RestController wyświetla się ścieżka do layoutu zamiast niego.

Co do przykładu to działa podobnie jak to co podał kiedyś @bakeraw2

bakeraw2 napisał(a):

Tu masz połączenie Spring REST + AngularJS:
https://github.com/DanielMichalski/spring-mvc-angularjs

0

@Hepek bo RestController jest dla kontrolerów które służą do obsługiwania zapytań RESTowych! Czyli takich gdzie nie zwracasz widoku a jsona. Jak dasz RestController to nie musisz potem wszędzie pisać @ResponseBody na przykład. Ale jak ty masz klasę "mother of all controllers" to niestety nie da rady ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1