[SPRING] 스프링 MVC 폼 데이터 바인딩을위한 String에서 Custom Object 로의 변환?
SPRING스프링 MVC 폼 데이터 바인딩을위한 String에서 Custom Object 로의 변환?
Spring MVC의 SimpleFormController를 Spring MVC의 form JTL과 함께 사용하여 Generic 객체를 편집하는 폼을 생성하고 있습니다.
내 양식에는 사용자가 드롭 다운을 통해 서버를 지정할 수있는 드롭 다운이 있습니다.
<form:form commandName="generic">
<form:select path="server">
<form:options items="${servers}" itemValue="id" itemLabel="name"/>
</form:select>
</form:form>
여기에있는 서버는 사용 가능한 모든 서버에 대한 데이터베이스 호출에 의해 전파됩니다. server는 Server ORM pojo입니다. 이는 다른 ORM pojo (Generic)의 하위 오브젝트로서 내 양식 백업 오브젝트 역할을합니다.
내 목표는 데이터베이스 수준에서 서버 테이블에 대한 외래 키로 표시되는 Generic의 서버 참조를 변경하는 것입니다.
JPA를 내 영속 계층으로 사용하고 JPA가 ORM pojos로 엔티티 클래스를 생성했습니다.
불행히도 내 양식을 제출할 때 String에서 Server로 변환 할 수 없어 제대로 바인딩되지 않는 것 같습니다.
Field error in object 'generic' on field 'server': rejected value [1]; codes [typeMismatch.generic.server,typeMismatch.server,typeMismatch.com.generic.orm.jpa.Server,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [generic.server,server]; arguments []; default message [server]]; default message [Failed to convert property value of type [java.lang.String] to required type [com.generic.orm.jpa.Server] for property 'server'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [com.generic.orm.jpa.Server] for property 'server': no matching editors or conversion strategy found], generic=com.generic.orm.jpa.generic[id=3]} and static attributes {}
나는 이것을 행하는 방법의 예를 행운으로 찾고 있었다. 내가이 질문에서했던 것처럼 SimpleFormController 내에서 무언가를 덮어 써야한다고 믿지만 Spring MVC의 문서는 세부 사항에 가볍다. 누구든지 나를 도울 수 있습니까?
해결법
-
==============================
1.나는 네가 옳다고 생각한다. String을 Server 인스턴스로 변환 할 수 있도록 전에했던 것처럼 바인더에 사용자 정의 편집기를 등록해야합니다. Spring 레퍼런스 문서에는 사용자 정의 PropertyEditor의 예제가있다.
나는 네가 옳다고 생각한다. String을 Server 인스턴스로 변환 할 수 있도록 전에했던 것처럼 바인더에 사용자 정의 편집기를 등록해야합니다. Spring 레퍼런스 문서에는 사용자 정의 PropertyEditor의 예제가있다.
나는 MVC 문서가 최선이 아니라는 것에 동의한다. Spring 포럼에서 인터넷 검색 및 검색을 많이해야했습니다.
-
==============================
2.Mark의 답을 보충하는 것처럼, 여기 컨트롤러에서 일을 마쳤습니다.
Mark의 답을 보충하는 것처럼, 여기 컨트롤러에서 일을 마쳤습니다.
@Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { binder.registerCustomEditor(Server.class, "serverId", new PropertyEditorSupport() { @Override public void setAsText(String text) { Server type = (Server) em.createNamedQuery("Server.findById") .setParameter("id", Short.parseShort(text)).getSingleResult(); setValue(type); } }); }
익명 클래스가 아니라 Spring injection을 사용하여이를 수행 할 수도 있습니다. 이것은 Mark의 대답의 링크에 의해 설명됩니다.
PropertyEditorSupport 대신 ClassEditor (아래 참조)를 확장 할 수도 있습니다. Javadoc 상태;
이 점의 이점을 완전히 이해할 수 있을지 모르지만 명심해야 할 점이 있습니다.
-
==============================
3.가능한 해결책은 "server.id"를 사용하는 것입니다. 따라서 스프링은 자동으로 선택된 값을 바인딩하거나 그 반대의 경우도 마찬가지입니다.
가능한 해결책은 "server.id"를 사용하는 것입니다. 따라서 스프링은 자동으로 선택된 값을 바인딩하거나 그 반대의 경우도 마찬가지입니다.
<form:form commandName="generic"> <form:select path="server.id"> <form:options items="${servers}" itemValue="id" itemLabel="name"/> </form:select> </form:form>
-
==============================
4.다른 예시:
다른 예시:
http://empire5.com/development/binding-a-custom-object-in-spring-3/
-
==============================
5.귀하의 컨트롤러에서 답변의 주석 버전 :
귀하의 컨트롤러에서 답변의 주석 버전 :
@org.springframework.web.bind.annotation.InitBinder("yourFormName") protected void initBinder( org.springframework.web.bind.WebDataBinder binder) { binder.registerCustomEditor(Server.class, "serverId", new PropertyEditorSupport() { @Override public void setAsText(String text) { Server s = ...; // do whatever needed to convert setValue(s); } });
from https://stackoverflow.com/questions/912257/converting-from-string-to-custom-object-for-spring-mvc-form-data-binding by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 / 자바 오류 : 네임 스페이스 요소 'annotation-config'... JDK 1.5 이상 (0) | 2018.12.12 |
---|---|
[SPRING] Spring MVC 3 Controller로부터 만 문자열 메시지를 돌려 준다. (0) | 2018.12.11 |
[SPRING] HikariCP 용 Spring을 사용하여 데이터 소스를 설정하는 방법은 무엇입니까? (0) | 2018.12.11 |
[SPRING] 이것은 Tomcat에서 메모리 누출을 일으킬 가능성이 매우 높습니까? (0) | 2018.12.11 |
[SPRING] @ComponentScan에서 @Component 제외 (0) | 2018.12.11 |