나는 사용자 만들기위한 몇 가지 형태가 있습니다어느 쪽도하지 BindingResult도 'userCreateForm'을 사용할 수 요청 속성으로 콩 이름에 대한 일반 대상 객체
<form:form action="${pageContext.request.contextPath}/user/create" method="post" modelAttribute="userCreateForm" autocomplete="off">
<table class="b-table table table-striped">
<tbody>
<tr>
<td><spring:message code="UI.Labels.User.FirstName"/></td>
<td>
<form:input type="text" path="firstName" cssClass="form-control"/>
</td>
</tr>
<tr>
<td><spring:message code="UI.Labels.User.LastName"/></td>
<td>
<form:input type="text" path="lastName" cssClass="form-control"/>
</td>
</tr>
<tr>
<td><spring:message code="UI.Labels.User.Role"/></td>
<td>
<form:select path="userRole" cssClass="form-control">
<form:options items="${roles}"/>
</form:select>
</td>
</tr>
<tr>
<td><spring:message code="UI.Labels.User.Email"/></td>
<td>
<form:input type="text" path="email" cssClass="form-control" autocomplete="off"/><span><form:errors path="email" cssClass="error"/></span>
</td>
</tr>
<tr>
<td><spring:message code="UI.Labels.User.Password"/></td>
<td>
<form:input type="password" path="password" cssClass="form-control" autocomplete="off"/><span></span>
</td>
</tr>
<tr>
<td><spring:message code="UI.Labels.User.Pictire"/></td>
<td>
<input type="file" name="file" cssClass="form-control"/><span></span>
</td>
</tr>
</tbody>
</table>
<button class="btn btn-primary" type="submit" name="submit">
<spring:message code="UI.Labels.User.Submit"/>
</button>
</form:form>
컨트롤러 :
@RequestMapping("/create")
public String createPage(Model model, Principal principal, Locale locale) {
final User loggedUser = getLoggedUser();
User userCreateForm = new User();
model.addAttribute("userCreateForm", userCreateForm);
//model.addAttribute("roles", Utils.localizedRoles(loggedUser.getUserRole(), messageSource, locale));
model.addAttribute("roles", systemRoleService.findAll());
return "user/create";
}
@RequestMapping(value = "/create", method = RequestMethod.POST)
public String create(
@ModelAttribute User userForm,
BindingResult bindingResult,
Model model,
Locale locale,
RedirectAttributes redirectAttributes) {
if(bindingResult.hasErrors()) {
return "user/create";
}
try {
userForm.setPassword(Utils.bcrypt(userForm.getPassword()));
userForm.setLogin(userForm.getEmail());
userService.create(userForm);
redirectAttributes.addFlashAttribute("success", messageSource.getMessage("UI.Messages.User.CreatedSuccess", null, locale));
} catch (ResourceException ue) {
final User loggedUser = getLoggedUser();
final List<String> failures = new ArrayList<>();
for(String m : ue.getMessages()) failures.add(messageSource.getMessage(m, null, locale));
model.addAttribute("failures", failures);
model.addAttribute("userCreateForm", userForm);
model.addAttribute("roles", Utils.localizedRoles(loggedUser.getUserRole(), messageSource, locale));
return "user/create";
}
return "redirect:/";
}
것은 내가 선택하지 않은 경우를 모든 역할 - 잘 작동하지만 역할없이 사용자를 저장하십시오.
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'userCreateForm' available as request attribute
는이 문제를 해결하기 위해 도와주세요 - 나는 .jsp를 누르십시오 '저장'에서 userRole을 선택하면 나는 오류가 있습니다. 뭐가 잘못 됐는지 말해 줄 수 있겠 니?
역할을 선택한 경우 @ModelAttribute에서 사용자 대신 SystemRole 개체가 표시됩니다. 왜 ...?
지금 나는 새로운 오류가있어 다음 제출 'userRole를'객체
Field error in object 'userCreateForm' on field 'userRole': rejected value [6]; codes [typeMismatch.userCreateForm.userRole,typeMismatch.userRole,typeMismatch.java.util.List,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userCreateForm.userRole,userRole]; arguments []; default message [userRole]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.List' for property 'userRole'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [ru.test.jpa.SystemRole] for property 'userRole[0]': no matching editors or conversion strategy found]
사용자에를 - 목록입니다. jsp에서 선택한 역할 목록을 얻으려면 어떻게해야합니까?
나는 컨버터를
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import ru.test.jpa.SystemRole;
@Component("userRoleConverter")
public class UserRoleConverter implements Converter<String, SystemRole> {
@Autowired
private ResourceService<SystemRole> systemRoleService;
@Override
public SystemRole convert(String id) {
return systemRoleService.findOne(Long.valueOf(id));
}
}
을 추가 스프린트-context.xml에
<beans:bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<beans:property name="converters">
<beans:ref bean="userRoleConverter"/>
</beans:property>
</beans:bean>
나는 여전히 같은 오류에 등록했다. 무엇이 잘못 되었나요?
감사합니다.
로그를 사용하려고 시도하십시오 (또는 적어도 Sytem.err.println을 사용하여 역할을 선택할 때 컨트롤러에서 사용하는 경로를 제어하십시오 - 오류가있는 것으로 의심됩니다 ... –
@SergeBallesta, 경로는 정확하지만 BUT 만약 역할을 선택했다면'@ ModelAttribute'에서 User ... 대신 SystemRole 객체를 얻습니다. ( – user1647166
'userForm'이 아닌'userCreateForm'이라는 이름의 객체에 바인딩하고 있습니다.'@ ModelAttribute'를 사용할 때 명시 적으로 이름을 지정하지 않으면 메소드 인수의 이름을 취합니다 (이 경우에는'userForm'). 매개 변수 이름을 변경하거나'@ ModelAttribute' 주석 내에서 명시 적으로 인수의 이름을 지정하십시오. 기본적으로 오류가 발생하면'userCreateForm' 객체가 사라지고'userForm'이 갑자기 사용 가능합니다. –