Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Spring MVC 3.
Список форумов
 ->  Java Enterprise и распределённые технологии


На страницу 1, 2, 3  След. 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
garbuz : 68
Новичок
Откуда: Saint-Petersburg

СообщениеФев 19, 2010 18:37 
Ответить с цитатой
Итак, относительно недавно вышел 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 Smile

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

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>
 


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

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

P.P.S. Ссылка на проект (IDEA) http://narod.ru/disk/18077159000/Spring3Demo.rar.html
К началу Посмотреть профиль Отправить личное сообщение
Jean : 1992
JavaTalks Team Member
Откуда: Санкт-Петербург

СообщениеФев 19, 2010 19:30 
Ответить с цитатой
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).
_________________
Всякое решение плодит новые проблемы


Последний раз редактировалось: Jean (Фев 19, 2010 20:24), всего редактировалось 2 раз(а)
К началу Посмотреть профиль Отправить личное сообщение
garbuz : 68
Новичок
Откуда: Saint-Petersburg

СообщениеФев 19, 2010 20:20 
Ответить с цитатой
Все, что сказал Jean, все чистая правда! Все работает Smile
К началу Посмотреть профиль Отправить личное сообщение
solver.it : 8
Новичок

СообщениеФев 22, 2010 4:09 
Ответить с цитатой
Загрузил проект. Открыл его в нетбинсе 6.8
На глассфише 2.1 аообще не работает,
А на гласфише 3.0 запускается, форму ввода показывает, но
при попытке сабмита вываливается с кучей ошибок...
К началу Посмотреть профиль Отправить личное сообщение
garbuz : 68
Новичок
Откуда: Saint-Petersburg

СообщениеФев 22, 2010 11:01 
Ответить с цитатой
Трэйс в студию!
К началу Посмотреть профиль Отправить личное сообщение
solver.it : 8
Новичок

СообщениеФев 22, 2010 11:33 
Ответить с цитатой
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:5Cool
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:5Cool
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
К началу Посмотреть профиль Отправить личное сообщение
Myryan : 103
Новичок

СообщениеФев 22, 2010 11:41 
Ответить с цитатой
Цитата:
Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V


Библиотечка asm.jar не находится в cp. Если спринг скачан с депенденси, тогда она есть в дистрибутиве. Иначе findjar.com.
К началу Посмотреть профиль Отправить личное сообщение
garbuz : 68
Новичок
Откуда: Saint-Petersburg

СообщениеФев 22, 2010 13:58 
Ответить с цитатой
Советую погуглить по ошибке
Код:
 java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter


Скорее всего у вас с какими-то либами проблема.
К началу Посмотреть профиль Отправить личное сообщение
Jean : 1992
JavaTalks Team Member
Откуда: Санкт-Петербург

СообщениеФев 24, 2010 2:37 
Ответить с цитатой
Что-то я не уверен насчет Spring 3.0 =))
Я только что обнаружил, что все описанные фишки работают, но при этом у меня в проекте в зависимостях spring 2.5.6... 0_o
_________________
Всякое решение плодит новые проблемы
К началу Посмотреть профиль Отправить личное сообщение
Староверъ : 7620
Ктапубеп
Откуда: Elfland

СообщениеФев 24, 2010 9:10 
Ответить с цитатой
Цитата:
@Autowired - через данную аннотацию указывается бин, который необходимо проинжектить в текущий класс.
А так же сделает ваш проект ночным кошмаром =) Эта злостная аннотация приведет к большой путанице в проекте. Хотя во время написания тестов - удобна, да. Хотя это вызвано, наверное, отсутствием альтернативного способа применения DI в тестах Smile
Цитата:
По мне так круто, нет монстроурозного abstractTransactionProxy
Эм.. а что это за прокси? С помощю Spring AOP транзакции и в XML описываются отлично..
Цитата:
коллекция уже имеющихся объектов (прощай referenceData...)
Стоп, referenceData() отвечал за другие функции - он добавлял какие-то "статические" объекты на страницу, он не был частью Модели страницы.. Логично предположить, что все-таки как-то можно указать метод, который будет аналогом referenceData(). Или подход был видоизменен =)
Цитата:
Тут прямо в скобках у метода указывается аннотация, которая говорит, что значение из урла надо использовать как переменную. Таким образом я из урла выцепляю id и действие, что надо сделать над объектом.
Прикольно =)
В общем пока не увидел таких вещей, в чем Spring MVC 3.0 сильно обгоняет более старую версию, но будем копать и не отчаиваться Smile
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
garbuz : 68
Новичок
Откуда: Saint-Petersburg

СообщениеФев 24, 2010 18:54 
Ответить с цитатой
Цитата:
А так же сделает ваш проект ночным кошмаром =) Эта злостная аннотация приведет к большой путанице в проекте.
Почему же? По-моему, так удобно, никаких сеттеров, меньше кода, в бины необязательно вставлять <property> теги.

Цитата:
Эм.. а что это за прокси? С помощю 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>


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


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


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


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

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

Код:
 public String setupForm(@RequestParam("petId") int petId, ModelMap model) {


PS. На самом деле, эта аннотация и некоторые описанные вещи появились в спринге 2.5, но я лично отношу их к 3. Smile
К началу Посмотреть профиль Отправить личное сообщение
Староверъ : 7620
Ктапубеп
Откуда: Elfland

СообщениеФев 24, 2010 19:53 
Ответить с цитатой
Цитата:
Почему же? По-моему, так удобно, никаких сеттеров, меньше кода, в бины необязательно вставлять <property> теги.
А если у тебя несколько бинов одного класса? Что тогда, @Resource использовать? А потом захочешь переименовать бин и лазь по всему проекту, выискивая все occurences.. Мне часто бывает нужным, к примеру, Map<String, Object> создать в контейнере - с помощью @Autowired ты не сможешь заинжектить мапу, если их несколько. А еще интересно, что насчет PropertiesPlaceHolder'a? Как ты будешь инжектить ${someProperty}?
Насчет TransactionManager'a - отличное решение с помощью XML, которое ты привел - не нужно все методы или классы аннотирывать отдельно с помощью @Transactional - все в одном месте, все коротко и ясно.
Цитата:
Возможно, однако я всегда использовал данный метод, для того чтобы вытащить на страницу уже имеющиеся объекты модели
Не, их как раз в backingObject() нужно пихать, ибо backing object - это модель страницы. Хотя тут тоже спорно - статика тоже вроде как модель страницы..
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
Myryan : 103
Новичок

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


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


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

СообщениеМар 08, 2010 16:17 
Ответить с цитатой
Вот кстати нашел статью про Spring 3 на русском.
Написана правда косноязычновато

http://www.finecosoft.ru/spring_3
К началу Посмотреть профиль Отправить личное сообщение
Jackpad : 7
Новичок

СообщениеМар 15, 2010 0:18 
Ответить с цитатой
Постигаю азы аннотаций 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
'project.web.controller.SimpleController@1017ca1'
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 [project.web.controller.SimpleController@1017ca1]: java.lang.NullPointerException
DEBUG 2010-03-14 23:09:04,243 [org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver] - Resolving exception from ha
ndler [project.web.controller.SimpleController@1017ca1]: java.lang.NullPointerException
DEBUG 2010-03-14 23:09:04,245 [org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver] - Resolving exception from handl
er [project.web.controller.SimpleController@1017ca1]: 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 дня убил
К началу Посмотреть профиль Отправить личное сообщение MSN Messenger
 
Начать новую тему  Ответить на тему
Страница 1 из 3
На страницу 1, 2, 3  След.
Список форумов
 -> Java Enterprise и распределённые технологии


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru