Spring MVC 3.

 
 
 
Сообщения:72
Итак, относительно недавно вышел Spring 3. Сейчас у меня есть иногда свободное время, поэтому получилось его немного посмотреть и с ним ознакомиться.
Итак, я не буду разливаться что такое спринг, для чего он нужен, а сразу перейду к делу. Рассмотренное ниже приложение очень простое и показывает только основные возможности и фичи. Приложение предоставляет набор CRUD операций над некой сущностью.

web.xml
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
            /WEB-INF/databaseConfig.xml
            /WEB-INF/dispatcher-servlet.xml
        </param-value>
    </context-param>
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>



Как мы видим, ничего не поменялось. Ничего страшного, стабильность - залог успеха.

Модель данных

package my.example.entity;
import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name = "USERS")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

    @Column(name = "email", nullable = false)
    private String email;

    @Column(name = "birth", nullable = false)
    private Date birth;

   // geteers & setters


Тут я думаю все понятно.

Интерфейс
public interface UserDAO {
    public void add(User user);
    public void update(User user);
    public void delete(User user);
    public User getById(Long id);
    public List<User> getAll();
}


Реализация

package my.example.dao.impl;

import my.example.dao.UserDAO;
import my.example.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

@Repository
public class UserDAOImpl implements UserDAO {

    private HibernateTemplate template;

    @Autowired
    public void setTemplate(HibernateTemplate template) {
        this.template = template;
    }

    @Transactional
    public void add(User user) {
      template.save(user);
        template.flush();
    }
    @Transactional
    public void update(User user) {
        template.saveOrUpdate(user);
        template.flush();
    }
    @Transactional
    public void delete(User user) {
        template.delete(user);
        template.flush();
    }
    @Transactional
    public User getById(Long id) {
        return (User) template.get(User.class, id);
    }
    @Transactional
    public List<User> getAll() {
        return template.find("from User");
    }
}


Тут появилось уже несколько новых аннтотаций.
1) @Repository - насколько я понял, аннотация необходима для определения типа исключения которое может случиться при работе с данными.
2) @Autowired - через данную аннотацию указывается бин, который необходимо проинжектить в текущий класс.
3) @Transactional - аннтотация необходима менеджеру транзакций, чтобы работать с данным методом. Конфигурация будет ниже.

Класс сервиса, делегирующего дао-методы, будет использоваться в контроллере.
package my.example.service;

import my.example.dao.UserDAO;
import my.example.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;

public class UserService {

    private UserDAO userDAO;

    @Autowired
    public void setUserDAO(UserDAO userDAO) {
        this.userDAO = userDAO;
    }

    public void add(User user) {
        userDAO.add(user);
    }

    public void update(User user) {
        userDAO.update(user);
    }

    public void delete(User user) {
        userDAO.delete(user);
    }

    public User getById(Long id) {
        return userDAO.getById(id);
    }

    public List<User> getAll() {
        return userDAO.getAll();
    }
}


application-context.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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <context:annotation-config/>

    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

    <bean name="userDAO" class="my.example.dao.impl.UserDAOImpl">
        <property name="template" ref="hibernateTemplate"/>
    </bean>

    <bean name="userService" class="my.example.service.UserService">
        <property name="userDAO" ref="userDAO"/>
    </bean>


</beans>


Конфигурация базы и дао.

<?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:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/spring3demo"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>


    <bean name="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
          id="sessionFac">
        <property name="dataSource" ref="dataSource"/>
        <property name="annotatedClasses">
            <list>
                <value>my.example.entity.User</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
                hibernate.show_sql=true
            </value>
        </property>
    </bean>

    <bean name="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <tx:annotation-driven transaction-manager="txManager"/>

    <bean name="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

</beans>


Ну как? Нравится? По мне так круто, нет монстроурозного abstractTransactionProxy :)

Ну теперь наверно перейдем к самому вкусному - контроллеру.

dispatcher-servlet.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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <context:component-scan base-package="my.example.controller"/>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <mvc:annotation-driven/>

    <bean name="userValidator" class="my.example.validator.UserValidator"/>

</beans>


Строчка <context:component-scan base-package="my.example.controller"/> указывает какой пэкадж сканить на нличие контроллеров.
Помимо этого в конфиге остался только резолвер и бин валидатора. Никаких бинов контроллеров, урлмаппингов и всего прочего. Это особенно порадовало.

Ну и класс контроллера
package my.example.controller;

import my.example.entity.User;
import my.example.service.UserService;
import my.example.validator.UserValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.text.SimpleDateFormat;
import java.util.Date;

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private UserValidator userValidator;

    @RequestMapping("/")
    public String foo() {
        return "redirect:user";
    }


    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public ModelAndView get() {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("users");
        mav.addObject("users", userService.getAll());
        mav.addObject("user", new User());
        return mav;
    }

    @RequestMapping(method = RequestMethod.POST)
    public String add(@ModelAttribute("user") User user, BindingResult result) {
        userValidator.validate(user, result);
        if (result.hasErrors())
            return "/users";
        userService.update(user);
        return "redirect:/user";
    }


    @RequestMapping(value = "/user/{id}/{action}", method = RequestMethod.GET)
    public String edit(@PathVariable String id, @PathVariable String action, Model model) {
        User user = userService.getById(Long.parseLong(id));

        if (action.equals("delete")) {
            userService.delete(user);
            return "redirect:/user";
        }

        if (action.equals("edit"))
            model.addAttribute("user", user);
        return "/users";


    }


    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }

}

Итак, разберемся по пунктам:
1)Аннтотация @Controller необходима, чтобы спринг понял, что это контроллер.
2) Тут мы снова видим аннтотацию @Autowired, которая инфжектит бины в наш контроллер, однако тут я обошелся даже без сеттер-методов.
3)Метод get() откликается на урл /user. Как мы видим тут создается простой объект ModelAndView, в который помещается объект формы, если мы хотим работать с формой, коллекция уже имеющихся объектов (прощай referenceData...) и указывается имя вьюхи, на которую следует перейти.
4)Следующий метод add() предназначен для обработки сабмитов. Тут происходит создание нового объекта и редактирование имеющегося. Обратите внимание что метод возвращает строку. В первом случае это имя view, во втором это редирект на урл "/user"
5)Ну и метод еdit, в котором нам отдается редактируемый объект и происходит удаление объекта. Очень интересная строка
@RequestMapping(value = "/user/{id}/{action}", method = RequestMethod.GET)

Тут грубо говоря описан паттерн, если улр будет матчиться, то запрос будет обработан данным методом, очень круто на мой взягляд. Следующая строка тоже довольно интересна
public String edit(@PathVariable String id, @PathVariable String action, Model model)

Тут прямо в скобках у метода указывается аннотация, которая говорит, что значение из урла надо использовать как переменную. Таким образом я из урла выцепляю id и действие, что надо сделать над объектом. Костыли конечно, но мне нравится работать с сущностью в одном контроллере, а не в нескольких.
6) Ну и метод initBinder, в котором регистрируется кастомный обработчик даты. Кто будет запускать пример, дату вбивать в формате указанном у объекта SimpleDateFormat.

Ну и сама view
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%@ page session="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>


<table>
<c:forEach items="${users}" var="u">
    <tr>
        <td><c:out value="${u.name}"/></td>
        <td><c:out value="${u.email}"/></td>
        <td><c:out value="${u.birth}"/></td>
        <td><a href='<c:url value="user/${u.id}/edit"/>'>Edit</a></td>
        <td><a href='<c:url value="user/${u.id}/delete"/>'>Delete</a></td>
    </tr>
</c:forEach>
</table>

<form:form modelAttribute="user">
        <form:hidden path="id"/>
    <table>
        <tr>
            <td>Name</td>
            <td><form:input path="name"/><form:errors path="name" /></td>
        </tr>
        <tr>
            <td>Email</td>
            <td><form:input path="email"/><form:errors path="email" /></td>
        </tr>
        <tr>
            <td>Birth</td>
            <td><form:input path="birth"/><form:errors path="birth" /></td>    
        </tr>
        <tr>
            <td></td>
            <td><input type="submit"></td>
        </tr>
    </table>
</form:form>
 


Ну вот собственно и все. Возможно не очень красиво пока все, но это пока, дальше будет лучше, я уверен :)

PS. Старался разобраться с jsr 303 - bean validation и ее интеграцией со спрингом, но что-то пока не вышло. Кто выкурит тему и выложит, тому респект :)

P.P.S. Ссылка на проект (IDEA) http://narod.ru/disk/18077159000/Spring3Demo.rar.html
 
 
Сообщения:2030
garbuz:
<bean name="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" id="sessionFac">
    <property name="dataSource" ref="dataSource"/>
    <property name="annotatedClasses">
        <list>
            <value>my.example.entity.User</value>
        </list>
    </property>
   ...
</bean>

Я использую вместо annotatedClasses
    <property name="packagesToScan">
        <list>
            <value>com.vtsystems.entity</value>
        </list>
    </property>



Раз ты используешь <context:annotation-config/> и аннотацию @Autowired, то в context.xml необязательно прописывать <property ... /> для Дао, например, или для Сервиса. В этом случае Спринг сам все и обернет. И сеттеры для инжектируемых полей из классов тоже можно убрать.


Transactional я использую следующим образом:
@Transactional(rollbackFor = Exception.class)
public class ...

Т.е. указываю на классе Фасада, а не его методах. При этом нет необходимости повторять ее одинаковое определение. В случае, если нужно изменить поведение транзакции для конкретного метода, эту аннотацию я указываю с конкретными параметрами (например, что propagation = NOT_SUPPORTED).

Всякое решение плодит новые проблемы
Изменен:19 фев 2010 17:24
 
 
Сообщения:72
Все, что сказал Jean, все чистая правда! Все работает :)
 
 
Сообщения:34
Загрузил проект. Открыл его в нетбинсе 6.8
На глассфише 2.1 аообще не работает,
А на гласфише 3.0 запускается, форму ввода показывает, но
при попытке сабмита вываливается с кучей ошибок...
 
 
Сообщения:72
Трэйс в студию!
 
 
Сообщения:34
garbuz:
Трэйс в студию!


log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
PWC1412: WebModule[/awargames] ServletContext.log():Initializing Spring root WebApplicationContext
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
WebModule[/awargames]PWC1275: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFac' defined in ServletContext resource [/WEB-INF/databaseConfig.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:687)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:408)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:272)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:196)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4655)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:5364)
at com.sun.enterprise.web.WebModule.start(WebModule.java:345)
at com.sun.enterprise.web.LifecycleStarter.doRun(LifecycleStarter.java:58)
at com.sun.appserv.management.util.misc.RunnableBase.runSync(RunnableBase.java:304)
at com.sun.appserv.management.util.misc.RunnableBase.run(RunnableBase.java:341)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFac' defined in ServletContext resource [/WEB-INF/databaseConfig.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1403)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:386)
at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:266)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:139)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.<init>(PersistenceExceptionTranslationInterceptor.java:79)
at org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor.<init>(PersistenceExceptionTranslationAdvisor.java:70)
at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java:99)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1422)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1391)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
... 22 more
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)
at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:117)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:117)
at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:43)
at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:162)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:135)
at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:56)
at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:302)
at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:434)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1300)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:855)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:774)
at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1400)
... 37 more
PWC1306: Startup of context /awargames failed due to previous errors
PWC1412: WebModule[/awargames] ServletContext.log():Closing Spring root WebApplicationContext
WebModule[/Spring3Demo]PWC1275: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFac' defined in ServletContext resource [/WEB-INF/databaseConfig.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:671)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:401)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4655)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:5364)
at com.sun.enterprise.web.WebModule.start(WebModule.java:345)
at com.sun.enterprise.web.LifecycleStarter.doRun(LifecycleStarter.java:58)
at com.sun.appserv.management.util.misc.RunnableBase.runSync(RunnableBase.java:304)
at com.sun.appserv.management.util.misc.RunnableBase.run(RunnableBase.java:341)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFac' defined in ServletContext resource [/WEB-INF/databaseConfig.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1401)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:385)
at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:266)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:121)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.<init>(PersistenceExceptionTranslationInterceptor.java:77)
at org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor.<init>(PersistenceExceptionTranslationAdvisor.java:70)
at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java:99)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1422)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1389)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512)
... 22 more
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)
at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:117)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:117)
at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:43)
at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:162)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:135)
at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:56)
at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:302)
at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:434)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1300)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:855)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:774)
at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1398)
... 37 more
PWC1306: Startup of context /Spring3Demo failed due to previous errors
PWC1412: WebModule[/Spring3Demo] ServletContext.log():Closing Spring root WebApplicationContext
 
 
Сообщения:177
Quote:
Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V


Библиотечка asm.jar не находится в cp. Если спринг скачан с депенденси, тогда она есть в дистрибутиве. Иначе findjar.com.
 
 
Сообщения:72
Советую погуглить по ошибке
 java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter


Скорее всего у вас с какими-то либами проблема.
 
 
Сообщения:2030
Что-то я не уверен насчет Spring 3.0 =))
Я только что обнаружил, что все описанные фишки работают, но при этом у меня в проекте в зависимостях spring 2.5.6... 0_o

Всякое решение плодит новые проблемы
 
 
Сообщения:9476
Quote:
@Autowired - через данную аннотацию указывается бин, который необходимо проинжектить в текущий класс.
А так же сделает ваш проект ночным кошмаром =) Эта злостная аннотация приведет к большой путанице в проекте. Хотя во время написания тестов - удобна, да. Хотя это вызвано, наверное, отсутствием альтернативного способа применения DI в тестах :)
Quote:
По мне так круто, нет монстроурозного abstractTransactionProxy
Эм.. а что это за прокси? С помощю Spring AOP транзакции и в XML описываются отлично..
Quote:
коллекция уже имеющихся объектов (прощай referenceData...)
Стоп, referenceData() отвечал за другие функции - он добавлял какие-то "статические" объекты на страницу, он не был частью Модели страницы.. Логично предположить, что все-таки как-то можно указать метод, который будет аналогом referenceData(). Или подход был видоизменен =)
Quote:
Тут прямо в скобках у метода указывается аннотация, которая говорит, что значение из урла надо использовать как переменную. Таким образом я из урла выцепляю id и действие, что надо сделать над объектом.
Прикольно =)
В общем пока не увидел таких вещей, в чем Spring MVC 3.0 сильно обгоняет более старую версию, но будем копать и не отчаиваться :)
 
 
Сообщения:72
Quote:
А так же сделает ваш проект ночным кошмаром =) Эта злостная аннотация приведет к большой путанице в проекте.
Почему же? По-моему, так удобно, никаких сеттеров, меньше кода, в бины необязательно вставлять <property> теги.

Quote:
Эм.. а что это за прокси? С помощю Spring AOP транзакции и в XML описываются отлично..


Вот как я это делал раньше

<bean name="abstractTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
          abstract="true">
        <property name="transactionManager" ref="txManager"/>
        <property name="transactionAttributes">
            <props>
                <prop key="find*">PROPAGATION_REQUIRED, readOnly
                </prop>
                <prop key="get*">PROPAGATION_REQUIRED, readOnly
                </prop>
                <prop key="create*">PROPAGATION_REQUIRED,-Exception
                </prop>
                <prop key="update*">PROPAGATION_REQUIRED,-Exception
                </prop>
                <prop key="delete*">PROPAGATION_REQUIRED,-Exception
                </prop>
            </props>
        </property>
    </bean>


Давай свой вариант выкладывай.


Quote:
Стоп, referenceData() отвечал за другие функции - он добавлял какие-то "статические" объекты на страницу, он не был частью Модели страницы.. Логично предположить, что все-таки как-то можно указать метод, который будет аналогом referenceData(). Или подход был видоизменен =)


Возможно, однако я всегда использовал данный метод, для того чтобы вытащить на страницу уже имеющиеся объекты модели, ну и статику если необходимо.


Quote:
Прикольно =)
В общем пока не увидел таких вещей, в чем Spring MVC 3.0 сильно обгоняет более старую версию, но будем копать и не отчаиваться

Согласен :) Еще появилась одна интересная аннотация, которая в примере не была рассмотрена это @RequestParam
Позволяет вытаскивать из запроса нужный параметр. Типа того.

 public String setupForm(@RequestParam("petId") int petId, ModelMap model) {


PS. На самом деле, эта аннотация и некоторые описанные вещи появились в спринге 2.5, но я лично отношу их к 3. :)
 
 
Сообщения:9476
Quote:
Почему же? По-моему, так удобно, никаких сеттеров, меньше кода, в бины необязательно вставлять <property> теги.
А если у тебя несколько бинов одного класса? Что тогда, @Resource использовать? А потом захочешь переименовать бин и лазь по всему проекту, выискивая все occurences.. Мне часто бывает нужным, к примеру, Map<String, Object> создать в контейнере - с помощью @Autowired ты не сможешь заинжектить мапу, если их несколько. А еще интересно, что насчет PropertiesPlaceHolder'a? Как ты будешь инжектить ${someProperty}?
Насчет TransactionManager'a - отличное решение с помощью XML, которое ты привел - не нужно все методы или классы аннотирывать отдельно с помощью @Transactional - все в одном месте, все коротко и ясно.
Quote:
Возможно, однако я всегда использовал данный метод, для того чтобы вытащить на страницу уже имеющиеся объекты модели
Не, их как раз в backingObject() нужно пихать, ибо backing object - это модель страницы. Хотя тут тоже спорно - статика тоже вроде как модель страницы..
 
 
Сообщения:177
Quote:
Quote:
Стоп, referenceData() отвечал за другие функции - он добавлял какие-то "статические" объекты на страницу, он не был частью Модели страницы.. Логично предположить, что все-таки как-то можно указать метод, который будет аналогом referenceData(). Или подход был видоизменен =)


Возможно, однако я всегда использовал данный метод, для того чтобы вытащить на страницу уже имеющиеся объекты модели, ну и статику если необходимо.


Есть возможность кинуть дополнительные данные на страницу и с помощью аннотаций. Необходимо использовать @ModelAttribute("noob"). Метод, помеченный этой аннотацией, будет вызван раньше чем аннотацией @RequestMapping и объект noob попадет в реквест.
 
 
Сообщения:1
Вот кстати нашел статью про Spring 3 на русском.
Написана правда косноязычновато

http://www.finecosoft.ru/spring_3
 
 
Сообщения:7
Постигаю азы аннотаций spring mvc 3.
Столкнулся с проблемой при переходе на аннотации. Код далее

Сущность

package project.data;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;

@Entity
@Table(name = "Language")
public class Language {

	private int id;
	private String name;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "Id")
	public int getId() {
		return id;
	}

	@NotNull
	@Length(max = 20)
	@Column(name = "Name")
	public String getName() {
		return name;
	}

	public void setId(int id) {
		this.id = id;
	}

	public void setName(String name) {
		this.name = name;
	}

}


интерфейс дао.

package project.dao;

import java.util.List;

import project.data.Language;

public interface LanguageDao {

	public void saveLanguage(Language language);

	public void updateLanguage(Language language);

	public void deleteLanguage(Language language);

	public Language getLanguage(int id);

	public List<Language> getAllLanguages();
}


реализация дао
package project.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import project.dao.LanguageDao;
import project.data.Language;

public class LanguageDaoImpl extends HibernateDaoSupport implements LanguageDao, Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	public void deleteLanguage(Language language) {
		getHibernateTemplate().delete(language);
	}

	@Override
	public Language getLanguage(int id) {
		return (Language) getHibernateTemplate().get(Language.class, id);
	}

	@Override
	public void saveLanguage(Language language) {
		getHibernateTemplate().save(language);
	}

	@Override
	public void updateLanguage(Language language) {
		getHibernateTemplate().update(language);
	}

	@Override
	public List<Language> getAllLanguages(){
		return getHibernateTemplate().loadAll(Language.class);
	}

}


Далее слой сервисов. Вообщем ничего необычного. интерфейс упускаю.


package project.service.impl;

import java.util.List;

import project.dao.LanguageDao;
import project.data.Language;
import project.service.LanguageService;

public class LanguageServiceImpl implements LanguageService {

	LanguageDao languageDao;

	public void setLanguageDao(LanguageDao languageDao) {
		this.languageDao = languageDao;
	}

	public LanguageDao getLanguageDao() {
		return languageDao;
	}

	@Override
	public void deleteLanguage(Language language) {
		languageDao.deleteLanguage(language);

	}

	@Override
	public List<Language> getAllLanguages() {
		return languageDao.getAllLanguages();
	}

	@Override
	public Language getLanguage(int id) {
		return languageDao.getLanguage(id);
	}

	@Override
	public void saveLanguage(Language language) {
		languageDao.saveLanguage(language);
	}

	@Override
	public void updateLanguage(Language language) {
		languageDao.updateLanguage(language);
	}

}


следом конфиги
db-applicationContext.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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context-3.0.xsd
                           http://www.springframework.org/schema/mvc
                           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
		p:location="/WEB-INF/jdbc.properties"
		p:ignoreUnresolvablePlaceholders="true" />

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}"
		p:username="${jdbc.username}" p:password="${jdbc.password}" />

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
		p:dataSource-ref="dataSource">
		<property name="annotatedPackages">
			<list>
				<value>project.data</value>
			</list>
		</property>
		<property name="annotatedClasses">
			<list>
				<value>project.data.Language</value>
			</list>
		</property>

		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${jdbc.hibernate.dialect}</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.generate_statistics">true</prop>
				<prop key="hibernate.connection.release_mode">auto</prop>
				<prop key="hibernate.autoReconnect">true</prop>
				<prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
			</props>
		</property>
	</bean>

	<bean id="txManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager"
		p:sessionFactory-ref="sessionFactory" />

	<bean id="languageDao" class="project.dao.impl.LanguageDaoImpl"
		p:sessionFactory-ref="sessionFactory" />


	<bean id="languageService"
	class="project.service.impl.LanguageServiceImpl"
		p:languageDao-ref="languageDao" />

	<bean id="messageSource"
		class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
		p:basenames="/WEB-INF/i18n/messages" p:defaultEncoding="UTF-8" />


	<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.SessionLocaleResolver"
		p:defaultLocale="ru" />

</beans>


dispatcher-servlet.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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context-3.0.xsd
                           http://www.springframework.org/schema/mvc
                           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">


	<context:component-scan base-package="project.web.controller" />
	<bean
		class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
		<property name="interceptors">
			<bean id="localeChangeInterceptor"
				class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"
				p:paramName="locale" />
		</property>
	</bean>
	<mvc:annotation-driven />


	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver"
		p:viewClass="org.springframework.web.servlet.view.JstlView" p:prefix="/jsp/"
		p:suffix=".jsp" />


</beans>


web.xml

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

	<!--
		- Location of the Log4J config file, for initialization and refresh
		checks. - Applied by Log4jConfigListener.
	-->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>/WEB-INF/log4j.properties</param-value>
	</context-param>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/spring-config/db-applicationContext.xml
			/WEB-INF/spring-config/dispatcher-servlet.xml
		</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>

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

	<servlet>
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value></param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<filter>
		<filter-name>encoding-filter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>encoding-filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


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

	<welcome-file-list>
		<welcome-file>/jsp/redirect.jsp</welcome-file>
	</welcome-file-list>

	<error-page>
		<error-code>404</error-code>
		<location>/jsp/redirect.jsp</location>
	</error-page>
</web-app>


Ну и конечно же сам контроллер с аннотациями.


package project.web.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import project.service.LanguageService;

@Controller
@RequestMapping(value="/home")
public class SimpleController {

	protected final Log logger = LogFactory.getLog(getClass());
	private LanguageService languageService;

	public void setLanguageService(LanguageService languageService) {
		this.languageService = languageService;
	}
    @RequestMapping(method = RequestMethod.GET)
	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		logger.info("\nView all languages .... \n");
		ModelAndView mav = new ModelAndView();
		mav.setViewName("home");
		mav.addObject("languages", languageService.getAllLanguages());
		return mav;
	}

}



Всё описанное выше при переходе на /home приводит к такой ошибке
INFO: Server startup in 6995 ms
DEBUG 2010-03-14 23:09:04,145 [org.springframework.web.servlet.DispatcherServlet] - DispatcherServlet with name 'dispatcher' determining Las
t-Modified value for [/portal/home]
DEBUG 2010-03-14 23:09:04,166 [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapping [/home] to handler
'[email protected]'
DEBUG 2010-03-14 23:09:04,174 [org.springframework.web.servlet.DispatcherServlet] - Last-Modified value for [/portal/home] is: -1
DEBUG 2010-03-14 23:09:04,187 [org.springframework.web.servlet.DispatcherServlet] - DispatcherServlet with name 'dispatcher' processing GET
request for [/portal/home]
DEBUG 2010-03-14 23:09:04,232 [org.springframework.web.bind.annotation.support.HandlerMethodInvoker] - Invoking request handler method: publ
ic org.springframework.web.servlet.ModelAndView project.web.controller.SimpleController.handleRequest(javax.servlet.http.Ht
tpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception
INFO 2010-03-14 23:09:04,233 [project.web.controller.SimpleController] -
View all languages ....

DEBUG 2010-03-14 23:09:04,235 [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver] - Resolving exceptio
n from handler [[email protected]]: java.lang.NullPointerException
DEBUG 2010-03-14 23:09:04,243 [org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver] - Resolving exception from ha
ndler [[email protected]]: java.lang.NullPointerException
DEBUG 2010-03-14 23:09:04,245 [org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver] - Resolving exception from handl
er [[email protected]]: java.lang.NullPointerException
DEBUG 2010-03-14 23:09:04,249 [org.springframework.web.servlet.DispatcherServlet] - Could not complete request
java.lang.NullPointerException
        at project.web.controller.SimpleController.handleRequest(SimpleController.java:31)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710)
        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.
java:414)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
        at java.lang.Thread.run(Thread.java:619)



Самое интересное что без использования аннотаций проблем нету, и всё выводится, но хочется сделать все кошерно, а не прописывать каждый контроллер в хмл .
Куда смотреть? 3 дня убил
 
Модераторы:wedens
Сейчас эту тему просматривают:Нет