Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Hibernate jsp Авторизация / 12 сообщений из 12, страница 1 из 1
28.08.2015, 11:56
    #39038282
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Hibernate jsp Авторизация
Коротко опишу часть проекта.

Есть 3 таблицы, отвечающие за пользователей и их права: users, role, usersandroles.

Есть jsp и форма, которая предназначена для создания новых пользователей в таблице users и запись их прав в таблице usersandroles.

Сейчас не все получается и поэтому вопрос, почему ошибка(блок, который отвечает за Roles)?
Http status 400: The request sent by the client was syntactically incorrect.

.jsp:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
<h1>New/Edit User</h1>
		<table>
			<form:form action="save" method="post" modelAttribute="user">
			<form:hidden path="id"/>
			<tr>
				<td>Username:</td>
				<td><form:input path="username"/></td>
			</tr>
			<tr>
				<td>Password:</td>
				<td><form:password path="password"/></td>
			</tr>
			<tr>
				<td>Status:</td>
				<td>
					<form:radiobutton path="status" value="ACTIVE" checked="checked"/>ACTIVE
					<form:radiobutton path="status" value="INACTIVE" />INACTIVE	
				</td>
			</tr>
					
			<tr>
				<td>Roles:</td>
				<td>			
					<c:forEach items="${roleList}" var="role" varStatus="i">
					    <form:checkbox path="roles[${i.index}].id" value="${role.id}"/>${role.roleName}<br/>
					</c:forEach>			
				</td>
			</tr>
									
			<tr>
				<td colspan="2" align="center">
					<input type="submit" value="Save">
				</td>
			</tr>			
			</form:form>
						
		</table>



User.java:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@Entity
@Table(name="Users")
public class User implements Serializable{
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int id;
	private String username;
	private String password;
	@ManyToMany
	@JoinTable(name="UsersAndRoles",
			joinColumns=@JoinColumn(name="user_id"),
			inverseJoinColumns=@JoinColumn(name="role_id"))
	private List<Role> roles;
	@Enumerated(EnumType.STRING)
	private UserStatus status;
...



Role.java:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Entity
public class Role {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int id;
	private String roleName;
	@ManyToMany(mappedBy = "roles")
	private List<User> users;
...


...
Рейтинг: 0 / 0
28.08.2015, 12:02
    #39038295
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Hibernate jsp Авторизация
Форма делает HTTP POST на относительный URL save. Кто его обрабатывает? Какое отношение к проблеме имеют ORM и сущности?
...
Рейтинг: 0 / 0
28.08.2015, 12:02
    #39038296
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Hibernate jsp Авторизация
wvetalHttp status 400: The request sent by the client was syntactically incorrect.

Ошибка, вроде, обозначает несовпадение параметров запроса и контроллера, который его пытался обработать.
...
Рейтинг: 0 / 0
28.08.2015, 12:09
    #39038310
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Hibernate jsp Авторизация
BlazkowiczФорма делает HTTP POST на относительный URL save. Кто его обрабатывает? Какое отношение к проблеме имеют ORM и сущности?
Код: java
1.
2.
3.
4.
5.
	@RequestMapping(value = "/save", method = RequestMethod.POST)
	public ModelAndView saveUser(@ModelAttribute User user) {
		userDao.saveOrUpdate(user);
		return new ModelAndView("redirect:/");
	}


Мне кажется проблема в этом кусочке:
Код: java
1.
2.
3.
<c:forEach items="${roleList}" var="role" varStatus="i">
    <form:checkbox path="roles[${i.index}].id" value="${role.id}"/>${role.roleName}<br/>
</c:forEach>
...
Рейтинг: 0 / 0
28.08.2015, 12:12
    #39038318
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Hibernate jsp Авторизация
... как правильно передать список id прав пользователей на контроллер?

Я думал, что так:
Код: java
1.
2.
3.
<c:forEach items="${roleList}" var="role" varStatus="i">
    <form:checkbox path="roles[${i.index}].id" value="${role.id}"/>${role.roleName}<br/>
</c:forEach>


Но не получилось.
...
Рейтинг: 0 / 0
28.08.2015, 12:23
    #39038334
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Hibernate jsp Авторизация
wvetal,

У вас в методе save один единственный User, а в форме куча разных параметров. Spring как именно должен догадаться параметры на User-а замапить?
Ну, и список параметров, это да. Отдельная тема.
http://stackoverflow.com/questions/15497738/handle-form-post-with-a-array-of-items-in-spring-mvc
http://stackoverflow.com/questions/5399347/how-to-pass-post-array-parameter-in-spring-mvc
...
Рейтинг: 0 / 0
28.08.2015, 12:37
    #39038355
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Hibernate jsp Авторизация
Blazkowiczwvetal,

У вас в методе save один единственный User, а в форме куча разных параметров. Spring как именно должен догадаться параметры на User-а замапить?

User - как раз и содержит [все] эти параметры(id; username; password; roles; status;), которые передает форма. Если не передавать параметр roles - то все нормально передается (просто тогда roles - null).
Как я понимаю, несовпадение в том, что roles - это List<Role> roles;
А я пытаюсь передать List<id>.

Ссылки глянул.
...
Рейтинг: 0 / 0
28.08.2015, 12:41
    #39038360
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Hibernate jsp Авторизация
wvetalКак я понимаю, несовпадение в том, что roles - это List<Role> roles;
А я пытаюсь передать List<id>.

Поэтому, если хочется получить класс, то создают UserForm, а не используют сущность. Хотя, можно где-то перехватить создание команды User и догрузить роли из репозитория.
...
Рейтинг: 0 / 0
28.08.2015, 15:17
    #39038578
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Hibernate jsp Авторизация
Придумал как передать список id ролей контроллеру.
В класс User добавил дополнительное свойство:
Код: java
1.
2.
@Transient
private List<Integer> userRoles;


А в форме так:
Код: java
1.
2.
3.
<c:forEach items="${roleList}" var="role" varStatus="i">
    <form:checkbox path="userRoles" value="${role.id}"/>${role.roleName}<br/>
</c:forEach>


А потом в контроллере перекину userRoles в roles.
...
Рейтинг: 0 / 0
02.09.2015, 10:08
    #39041171
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Hibernate jsp Авторизация
... Продолжение.

Нахожусь на этапе записи прав пользователя в таблицу usersandroles. Структура таблицы:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE usersandroles
(
  user_id integer NOT NULL,
  role_id integer NOT NULL,
  CONSTRAINT usersandroles_pk PRIMARY KEY (user_id, role_id),
  CONSTRAINT usersandroles_fk FOREIGN KEY (user_id)
      REFERENCES users (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT usersandroles_fk2 FOREIGN KEY (role_id)
      REFERENCES role (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)



Проблема заключалась в том что в этой таблице составной ключ. Почитал как это нужно делать тут .
Попробовал сделать по примеру, но не все получилось.

Вот что имею:
UsersAndRoles.java:

Код: java
1.
2.
3.
4.
5.
6.
@Entity
public class UsersAndRoles implements Serializable {
    @EmbeddedId
    private UsersAndRolesPK usersAndRolesPK;
	
}



UsersAndRolesPK.java:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
@Embeddable
public class UsersAndRolesPK implements Serializable {

	@Column(name="user_id")
	private int userId;
	@Column(name="role_id")
	private List<Integer> roleId;
	
	public UsersAndRolesPK(){}

	public UsersAndRolesPK(int userId, List<Integer> roleId) {
		super();
		this.userId = userId;
		this.roleId = roleId;
	}

	public int getUserId() {
		return userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

	public List<Integer> getRoleId() {
		return roleId;
	}

	public void setRoleId(List<Integer> roleId) {
		this.roleId = roleId;
	}
	
}



Дальше пробую записать в базу, например, такие данные: id пользователя - 9, права пользователя [1, 3].
Код: java
1.
2.
UsersAndRoles usersAndRoles = new UsersAndRoles(id, user.getUserRoles());//здесь ошибка, потому что нет конструктора с такими параметрами
usersAndRolesDAO.saveOrUpdate(usersAndRoles);


Пробовал также
Код: java
1.
UsersAndRolesPK usersAndRoles = new UsersAndRolesPK(id, user.getUserRoles());


Тогда билд проходит удачно, но при самой попытке записать данные в базу вылетает с ошибкой типа нет такой сущности UsersAndRolesPK.

Вопросы:
1 - Какую часть необходимо подправить?
2 - Какой конструктор должен принимать значения UsersAndRoles или UsersAndRolesPK?
3 - Правильно ли описаны UsersAndRoles.java и UsersAndRolesPK.java?
...
Рейтинг: 0 / 0
02.09.2015, 12:13
    #39041340
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Hibernate jsp Авторизация
1,2,3 Описывать сущность UsersAndRoles надо только в том случае, если там есть поля кроме тех, что входят PK.
В данном же случае следует использовать связь many-to-many, а к SO обращаться только после изучения главы "Collection mapping" документации
...
Рейтинг: 0 / 0
09.09.2015, 15:11
    #39047074
wvetal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Hibernate jsp Авторизация
ivanra, Blazkowicz,

Спасибо, разобрался.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Hibernate jsp Авторизация / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]