Spring MVC 3.

 
 
 
Сообщения:12
Добрый день.
Изучаю Spring MVC ( до hibernate еще не дошел). Запускаю выложенный пример в netbeans. Перенастроил соединение с MySql на встроенный в Netbeans Derby. Выдается вот такая ошибка:
 type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception 
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL [select user0_.id as id0_, user0_.name as name0_, user0_.email as email0_, user0_.birth as birth0_ from USERS user0_]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query


root cause 
org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL [select user0_.id as id0_, user0_.name as name0_, user0_.email as email0_, user0_.birth as birth0_ from USERS user0_]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query

root cause 
org.hibernate.exception.SQLGrammarException: could not execute query


root cause 
java.sql.SQLSyntaxErrorException: Column 'USER0_.NAME' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE  statement then 'USER0_.NAME' is not a column in the target table.

root cause 
org.apache.derby.client.am.SqlException: Column 'USER0_.NAME' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE  statement then 'USER0_.NAME' is not a column in the target table.


note The full stack traces of the exception and its root causes are available in the GlassFish v3 logs



Проверил тот же самый запрос выполнить через сам netbeans. Ругается, т.к. , по-видимому, name - зарезервированное в derby слово. Так как если тот же запрос, но вместо name написать "name", то запрос выполняется. Как это исправить в hibernate? Подскажите, пожалуйста.
 
 
Сообщения:12
Так и не решил вопрос. Пришлось использовать MySql
 
 
Сообщения:12
Разбираю этот пример. Хочу понять связку spring и hibernate. Вроде же для работы hibernate необходим файл hibernate.cfg.xml А тут его нет. Есть файл databaseConfig.xml
Он заменяет hibernate.cfg.xml ?
 
 
Сообщения:1517
hibernate.cfg.xml по сути нужен только когда hibernate используется без spring. с ним же его можно конфигурировать в контексте
 
 
Сообщения:12
wedens:
hibernate.cfg.xml по сути нужен только когда hibernate используется без spring. с ним же его можно конфигурировать в контексте


Спасибо за ответ.
 
 
Сообщения:12
Еще вопрос. Про кодировку. Никак не могу понять, где ее нужно описать.
Нарыл в интеренете, что для связки с MySql нужно в строку соединения добавлять кодировку.
<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/spring3demo1?useUnicode=true&amp;characterEncoding=cp1251"/>
        <property name="username" value="root"/>
        <property name="password" value="*****"/>
    </bean>


Т.е. добавилась строка ?useUnicode=true&amp;characterEncoding=cp1251
Но у меня почему-то все равно русские буквы пишутся вопросиками, хотя настройки MySQK такие:
character_set_results = cp1251
character_set_client = cp1251
character_set_connection = cp1251
character_set_database = cp1251
character_set_filesystem = bynary
character_set_server = cp1251
character_set_system = utf8

Куда еще копать?
 
 
Сообщения:12
проблема решилась добавлением в web.xml

<filter>
        <filter-name>charsetFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
                    <param-name>encoding</param-name>
                    <param-value>Cp1251</param-value>
		</init-param>
		<init-param>
                    <param-name>forceEncoding</param-name>
                    <param-value>true</param-value>
		</init-param>
    </filter>
    <filter-mapping>
	<filter-name>charsetFilter</filter-name>
	<url-pattern>/*</url-pattern>
    </filter-mapping>


А также пересоздал таблицы с явным указанием кодировки для кадого столбца
house varchar(3) CHARACTER SET cp1251 COLLATE cp1251_bin
и указанием в JSP
<%@ page contentType="text/html; charset=windows-1251" language="java" %>
 
 
Сообщения:23
а где class UserValidator?
 
 
Сообщения:12
bayramchik:
а где class UserValidator?


Там есть класс UserValidator. Он в пакете my.example.validator
 
 
Сообщения:120
может кто скинуть проект на netbeans
со спринг 3.1.1 на аннотациях + хибернейт
не могу понять в какие файлы надо вбивать настройки базы спринга и т.п
хочу посмотреть как это делается.
 
 
Сообщения:120
wedens:
hibernate.cfg.xml по сути нужен только когда hibernate используется без spring. с ним же его можно конфигурировать в контексте

а где контекст находиться? :)
это файл servlet-context.xml?
 
 
Сообщения:12
вообще-то, должен быть ApplicationContext.xml
 
 
Сообщения:120
почистил за собой
Изменен:27 июн 2012 08:40
 
 
Сообщения:120
если ли аннотация заменяющая это?
    <bean name="userDAO" class="my.example.dao.impl.UserDAOImpl">
        <property name="template" ref="hibernateTemplate"/>
    </bean>

для такого
<bean name="Service" class="net.service.mService">
    </bean>

я поставил аннотацию @Service и работает

а уже нашел @Repository

да уж поломал я себе голову со спрингом ,половина настроек из первого примера дублирует друг друга (у меня это приводило к ошибкам) некоторые можно заменить на более лаконичные аннотации возможно пример просто устарел всетаки 2010 года
 
 
Сообщения:280
Сам сейчас активно разбираюсь со spring.
Если кому нужно, вот доделывание примера garbuz-а.
(добавление валидации - JSR 303(Hibernate Validator), без UserValidator)

Что добавляем: у User-а теперь поле name может быть длинной от 3 до 50 и состоять только из латиницы и цифр.(это как пример - к остальным полям ничего применяться не будет для краткости)
Итак добавляем @Size и @Pattern:
User.java
    @Column(name = "name", nullable = false)
    @Size(min = 3, max = 50, message = "Name must be between 3 and 50 characters long")
    @Pattern(regexp = "^[a-zA-Z0-9]+$", message = "Name must be alphanumeric")
    private String name;

и
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;


Добавляем саму валидацию при создании нового user-а(добавляем @Valid, а userValidator не нужен - spring сам все проверит, а точнее - Hibernate Validator):
    @RequestMapping(method = RequestMethod.POST)
    public String add(@Valid @ModelAttribute("user") User user, BindingResult result) {
        if (result.hasErrors())
            return "/users";
        userService.update(user);
        return "redirect:/user";
    }


Теперь что происходит и откуда берется валидация:
spring из-за
<mvc:annotation-driven/>
<context:component-scan base-package="my.example.controller"/>

Сам находит наш UserController.
Видит @Valid перед User. Если есть имплементация JSR-303(про нее чуть ниже), то она проверяет (при передаче нового user-а контроллеру) user-а на соответствие всем свойствам, заявленным в User через аннотации. (кстати, я возможно тут ошибаюсь - возможно правильнее сказать, что проверка проходит при создании объекта user(это логичнее, если учесть название BindingResult))

Если все свойства выполняются:
result.hasErrors()
вернет false, user сохранится и все хорошо.

Если хоть одно свойство нарушено: он вернет true, и тут уже jsp-страница показывает нам все ошибки, которые выдали @Pattern и @Size (а именно - их message)
Например
<form:errors path="name" />
выдает все message не выполненных свойств поля name. (по умолчанию через <br/>, но можно задать и свой разделитель) например:
<form:errors path="name" delimiter=",   "/>

Чтобы вывести все ошибки(скорее даже предупреждения) в одном месте, нужно path="name" заменить на path="*".

И теперь самое главное(я с этим долго тупил и не мог найти решение).
Spring требуется реализация JSR - 303. Их на данный момент две, но, как я понял, исторически основная эта(но она вроде чуть медленне, чем эта) :
<dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>4.2.0.Final</version>
</dependency>
(это^ maven зависимость, если мавен не используется, можно скачать jar-ник вручную)
Вроде как hibernate validator был раньше, чем JSR-303(т.е. JSR-303 сам основан на нем - но это я где-то прочитал, могу ошибаться)

P.S. я не компилировал ни исходники garbus, ни тем более свои изменения. Это в первую очередь для тех, кто пытается добавить валидацию, а она почему-то не работает(так было у меня - как уже сказано, достаточно добавить Hibernate Validator)
И еще: не надо думать, что раз Hibernate, то тут используется сам Hibernate. Hibernate Validator - отдельная удобная штука.
 
Модераторы:wedens
Сейчас эту тему просматривают:Нет