복붙노트

[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. ==============================

    1.나는 네가 옳다고 생각한다. String을 Server 인스턴스로 변환 할 수 있도록 전에했던 것처럼 바인더에 사용자 정의 편집기를 등록해야합니다. Spring 레퍼런스 문서에는 사용자 정의 PropertyEditor의 예제가있다.

    나는 네가 옳다고 생각한다. String을 Server 인스턴스로 변환 할 수 있도록 전에했던 것처럼 바인더에 사용자 정의 편집기를 등록해야합니다. Spring 레퍼런스 문서에는 사용자 정의 PropertyEditor의 예제가있다.

    나는 MVC 문서가 최선이 아니라는 것에 동의한다. Spring 포럼에서 인터넷 검색 및 검색을 많이해야했습니다.

  2. ==============================

    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. ==============================

    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. ==============================

    4.다른 예시:

    다른 예시:

    http://empire5.com/development/binding-a-custom-object-in-spring-3/

  5. ==============================

    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);
            }
        });
    
  6. 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