[SPRING] 사용자 정의 속성 편집기가 Spring MVC의 요청 매개 변수에 대해 작동하지 않습니까?
SPRING사용자 정의 속성 편집기가 Spring MVC의 요청 매개 변수에 대해 작동하지 않습니까?
스프링 애노테이션을 사용하여 멀티 액션 웹 컨트롤러를 만들려고합니다. 이 컨트롤러는 사용자 프로필을 추가 및 제거하고 jsp 페이지의 참조 데이터를 준비합니다.
@Controller
public class ManageProfilesController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(UserAccount.class,"account", new UserAccountPropertyEditor(userManager));
binder.registerCustomEditor(Profile.class, "profile", new ProfilePropertyEditor(profileManager));
logger.info("Editors registered");
}
@RequestMapping("remove")
public void up( @RequestParam("account") UserAccount account,
@RequestParam("profile") Profile profile) {
...
}
@RequestMapping("")
public ModelAndView defaultView(@RequestParam("account") UserAccount account) {
logger.info("Default view handling");
ModelAndView mav = new ModelAndView();
logger.info(account.getLogin());
mav.addObject("account", account);
mav.addObject("profiles", profileManager.getProfiles());
mav.setViewName(view);
return mav;
}
...
}
다음은 webContext.xml 파일의 일부입니다.
<context:component-scan base-package="ru.mirea.rea.webapp.controllers" />
<context:annotation-config/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
...
/home/users/manageProfiles=users.manageProfilesController
</value>
</property>
</bean>
<bean id="users.manageProfilesController" class="ru.mirea.rea.webapp.controllers.users.ManageProfilesController">
<property name="view" value="home\users\manageProfiles"/>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
그러나 매핑 된 URL을 열면 예외가 발생합니다.
java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [ru.mirea.rea.model.UserAccount]: no matching editors or conversion strategy found
나는 봄 2.5.6을 사용하고 아주 먼 미래에 Spring 3.0으로 이동할 계획이다. 그러나이 JIRA https://jira.springsource.org/browse/SPR-4182에 따르면 이미 2.5.1에서 가능할 것입니다.
디버그는 InitBinder 메소드가 올바르게 호출되었음을 보여줍니다.
내가 뭘 잘못하고 있죠?
최신 정보:
public class UserAccountPropertyEditor extends PropertyEditorSupport {
static Logger logger = Logger.getLogger(UserAccountPropertyEditor.class);
public UserAccountPropertyEditor(IUserDAO dbUserManager) {
this.dbUserManager = dbUserManager;
}
private IUserDAO dbUserManager;
public String getAsText() {
UserAccount obj = (UserAccount) getValue();
if (null==obj) {
return "";
} else {
return obj.getId().toString();
}
}
public void setAsText(final String value) {
try {
Long id = Long.parseLong(value);
UserAccount acct = dbUserManager.getUserAccountById(id);
if (null!=acct) {
super.setValue(acct);
} else {
logger.error("Binding error. Cannot find userAccount with id ["+value+"]");
throw new IllegalArgumentException("Binding error. Cannot find userAccount with id ["+value+"]");
}
} catch (NumberFormatException e) {
logger.error("Binding error. Invalid id: " + value);
throw new IllegalArgumentException("Binding error. Invalid id: " + value);
}
}
}
UserAccountPropertyEditor에서 로깅 된 오류가 없습니다.
해결법
-
==============================
1.WebDataBinder.registerCustomEditor ()에 필드 인수를 지정하고 싶지 않습니다. 이것은 form-backing 객체와 함께 작동하기위한 것이지 당신은 그것을 사용하지 않고 있습니다.
WebDataBinder.registerCustomEditor ()에 필드 인수를 지정하고 싶지 않습니다. 이것은 form-backing 객체와 함께 작동하기위한 것이지 당신은 그것을 사용하지 않고 있습니다.
대신에 간단한 2-arg 메소드를 사용해보십시오.
binder.registerCustomEditor(UserAccount.class, new UserAccountPropertyEditor(userManager)); binder.registerCustomEditor(Profile.class, new ProfilePropertyEditor(profileManager));
from https://stackoverflow.com/questions/2998761/custom-property-editors-do-not-work-for-request-parameters-in-spring-mvc by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring MVC Controller의 클래스 속성으로서 Session scope bean (0) | 2019.04.12 |
---|---|
[SPRING] json 파일에서 spring-boot 특성로드 (0) | 2019.04.12 |
[SPRING] Spring과 Hibernate를 이용한 다중 데이터베이스 트랜잭션 관리 (0) | 2019.04.12 |
[SPRING] 스프링 부트는 문자열에서 자리 표시자를 해결할 수 없습니다. (0) | 2019.04.12 |
[SPRING] Spring 4 with thymeleaf 국제화는 자원 특성 파일에서 메시지를 식별하지 못함 (0) | 2019.04.12 |