|
|
Java форум JavaTalks форум программистов
|
|
|
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
garbuz Новичок

Зарегистрирован: 26.11.2008 Сообщения: 61 Откуда: Saint-Petersburg
|
Добавлено: Фев 19, 2010 18:37 Заголовок сообщения: Spring MVC 3. |
|
|
Итак, относительно недавно вышел 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 |
|
| Вернуться к началу |
|
 |
Jean JavaTalks Team Member

Зарегистрирован: 28.12.2006 Сообщения: 1819 Откуда: Санкт-Петербург
|
Добавлено: Фев 19, 2010 19:30 Заголовок сообщения: Re: Spring MVC 3. |
|
|
| 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 Новичок

Зарегистрирован: 26.11.2008 Сообщения: 61 Откуда: Saint-Petersburg
|
Добавлено: Фев 19, 2010 20:20 Заголовок сообщения: RE: Spring MVC 3. |
|
|
Все, что сказал Jean, все чистая правда! Все работает  |
|
| Вернуться к началу |
|
 |
solver.it Новичок
Зарегистрирован: 21.02.2010 Сообщения: 3
|
Добавлено: Фев 22, 2010 4:09 Заголовок сообщения: RE: Spring MVC 3. |
|
|
Загрузил проект. Открыл его в нетбинсе 6.8
На глассфише 2.1 аообще не работает,
А на гласфише 3.0 запускается, форму ввода показывает, но
при попытке сабмита вываливается с кучей ошибок... |
|
| Вернуться к началу |
|
 |
garbuz Новичок

Зарегистрирован: 26.11.2008 Сообщения: 61 Откуда: Saint-Petersburg
|
Добавлено: Фев 22, 2010 11:01 Заголовок сообщения: RE: Spring MVC 3. |
|
|
| Трэйс в студию! |
|
| Вернуться к началу |
|
 |
solver.it Новичок
Зарегистрирован: 21.02.2010 Сообщения: 3
|
Добавлено: Фев 22, 2010 11:33 Заголовок сообщения: Re: RE: Spring MVC 3. |
|
|
| 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:5
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:5
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 Новичок
Зарегистрирован: 11.02.2010 Сообщения: 17
|
Добавлено: Фев 22, 2010 11:41 Заголовок сообщения: RE: Spring MVC 3. |
|
|
| Цитата: |
Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
|
Библиотечка asm.jar не находится в cp. Если спринг скачан с депенденси, тогда она есть в дистрибутиве. Иначе findjar.com. |
|
| Вернуться к началу |
|
 |
garbuz Новичок

Зарегистрирован: 26.11.2008 Сообщения: 61 Откуда: Saint-Petersburg
|
Добавлено: Фев 22, 2010 13:58 Заголовок сообщения: RE: Spring MVC 3. |
|
|
Советую погуглить по ошибке
| Код: |
java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter |
Скорее всего у вас с какими-то либами проблема. |
|
| Вернуться к началу |
|
 |
Jean JavaTalks Team Member

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

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

Зарегистрирован: 26.11.2008 Сообщения: 61 Откуда: Saint-Petersburg
|
Добавлено: Фев 24, 2010 18:54 Заголовок сообщения: RE: Spring MVC 3. |
|
|
| Цитата: |
| А так же сделает ваш проект ночным кошмаром =) Эта злостная аннотация приведет к большой путанице в проекте. |
Почему же? По-моему, так удобно, никаких сеттеров, меньше кода, в бины необязательно вставлять <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 сильно обгоняет более старую версию, но будем копать и не отчаиваться |
Согласен Еще появилась одна интересная аннотация, которая в примере не была рассмотрена это @RequestParam
Позволяет вытаскивать из запроса нужный параметр. Типа того.
| Код: |
public String setupForm(@RequestParam("petId") int petId, ModelMap model) {
|
PS. На самом деле, эта аннотация и некоторые описанные вещи появились в спринге 2.5, но я лично отношу их к 3.  |
|
| Вернуться к началу |
|
 |
Староверъ Ктапубеп

Зарегистрирован: 26.01.2008 Сообщения: 5392 Откуда: Русь
|
Добавлено: Фев 24, 2010 19:53 Заголовок сообщения: RE: Spring MVC 3. |
|
|
| Цитата: |
| Почему же? По-моему, так удобно, никаких сеттеров, меньше кода, в бины необязательно вставлять <property> теги. |
А если у тебя несколько бинов одного класса? Что тогда, @Resource использовать? А потом захочешь переименовать бин и лазь по всему проекту, выискивая все occurences.. Мне часто бывает нужным, к примеру, Map<String, Object> создать в контейнере - с помощью @Autowired ты не сможешь заинжектить мапу, если их несколько. А еще интересно, что насчет PropertiesPlaceHolder'a? Как ты будешь инжектить ${someProperty}?
Насчет TransactionManager'a - отличное решение с помощью XML, которое ты привел - не нужно все методы или классы аннотирывать отдельно с помощью @Transactional - все в одном месте, все коротко и ясно.
| Цитата: |
| Возможно, однако я всегда использовал данный метод, для того чтобы вытащить на страницу уже имеющиеся объекты модели |
Не, их как раз в backingObject() нужно пихать, ибо backing object - это модель страницы. Хотя тут тоже спорно - статика тоже вроде как модель страницы.. |
|
| Вернуться к началу |
|
 |
Myryan Новичок
Зарегистрирован: 11.02.2010 Сообщения: 17
|
Добавлено: Фев 26, 2010 14:20 Заголовок сообщения: Re: RE: Spring MVC 3. |
|
|
| Цитата: |
| Цитата: |
| Стоп, referenceData() отвечал за другие функции - он добавлял какие-то "статические" объекты на страницу, он не был частью Модели страницы.. Логично предположить, что все-таки как-то можно указать метод, который будет аналогом referenceData(). Или подход был видоизменен =) |
Возможно, однако я всегда использовал данный метод, для того чтобы вытащить на страницу уже имеющиеся объекты модели, ну и статику если необходимо.
|
Есть возможность кинуть дополнительные данные на страницу и с помощью аннотаций. Необходимо использовать @ModelAttribute("noob"). Метод, помеченный этой аннотацией, будет вызван раньше чем аннотацией @RequestMapping и объект noob попадет в реквест. |
|
| Вернуться к началу |
|
 |
Abyecto Новичок
Зарегистрирован: 08.03.2010 Сообщения: 1
|
Добавлено: Мар 08, 2010 16:17 Заголовок сообщения: Re: RE: Spring MVC 3. |
|
|
Вот кстати нашел статью про Spring 3 на русском.
Написана правда косноязычновато
http://www.finecosoft.ru/spring_3 |
|
| Вернуться к началу |
|
 |
Jackpad Новичок
Зарегистрирован: 03.04.2008 Сообщения: 7
|
Добавлено: Мар 15, 2010 0:18 Заголовок сообщения: RE: Spring MVC 3. |
|
|
Постигаю азы аннотаций 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 дня убил |
|
| Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|