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

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

Ошибка, вроде, обозначает несовпадение параметров запроса и контроллера, который его пытался обработать.
...
Рейтинг: 0 / 0
Spring Hibernate jsp Авторизация
    #39038310
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Spring Hibernate jsp Авторизация
    #39038318
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
... как правильно передать список 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
Spring Hibernate jsp Авторизация
    #39038334
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Spring Hibernate jsp Авторизация
    #39038355
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczwvetal,

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

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

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

Поэтому, если хочется получить класс, то создают UserForm, а не используют сущность. Хотя, можно где-то перехватить создание команды User и догрузить роли из репозитория.
...
Рейтинг: 0 / 0
Spring Hibernate jsp Авторизация
    #39038578
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Придумал как передать список 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
Spring Hibernate jsp Авторизация
    #39041171
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
... Продолжение.

Нахожусь на этапе записи прав пользователя в таблицу 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
Spring Hibernate jsp Авторизация
    #39041340
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1,2,3 Описывать сущность UsersAndRoles надо только в том случае, если там есть поля кроме тех, что входят PK.
В данном же случае следует использовать связь many-to-many, а к SO обращаться только после изучения главы "Collection mapping" документации
...
Рейтинг: 0 / 0
Spring Hibernate jsp Авторизация
    #39047074
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanra, Blazkowicz,

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


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