복붙노트

[SPRING] 스프링 데이터 기능을 사용하여 데이터를 바인딩 할 수 없음

SPRING

스프링 데이터 기능을 사용하여 데이터를 바인딩 할 수 없음

쓰레드가 데이터 - 백 - 컨트롤러 - 스프링 -mvc 전송 중 계속됨

나는 사용자에게 몇 가지 옵션을 보여줄 필요가있는 제품 세부 정보 페이지에서 작업 중이며 사용자는 몇 가지를 선택하고 제출 버튼 제품은 바구니에 추가해야합니다. 내 의도는 해당 데이터 개체를 내 장바구니 컨트롤러로 전송하여 해당 값을 사용할 수 있고 개체에 동적 값이 포함되어 있으므로 미리 결정된 필드 개체를 정의 할 수 없기 때문입니다. 내 데이터 개체입니다.

public class PrsData {
    private Map<String, List<PrsCDData>> prsCDData;

    public PrsData(){
        this.prsCDData = MapUtils.lazyMap(new HashMap<String, List<PrsCDData>>(),
        FactoryUtils.instantiateFactory(PrsCDData.class));
    }
} 

public class PrsCDData {
    private Map<String, List<ConfiguredDesignData>> configuredDesignData;
    // same lazy map initialization
}

내 제품 세부 페이지 컨트롤러에서 값을 다음과 같이 설정합니다.

model.addAttribute("prsData", productData.getPrsData());

내 제품 세부 정보 페이지에서 JSP 형식을 사용합니다.

<form:form method="post" commandName="prsData" action="${addProductToCartAction}" >
    <form:hidden path="prsCDData[''${prsCDDataMap.key}'']
                    [${status.index}].configuredDesignData['${configuredDesignDataMap.key}']
                    [${configuredDesignDataStatus.index}].code" />
</form:form>

하지만 제출 단추를 클릭하면 다음 예외가 발생합니다.

org.springframework.beans.InvalidPropertyException: 
    Invalid property 'prsCDData['Forced'][0]' of bean class [com.product.data.PrsData]: 
        Property referenced in indexed property path 'prsCDData['Forced'][0]' 
        is neither an array nor a List nor a Set nor a Map; 
        returned value was [com.product.data.PrsCDData@6164f07e]

나는 제품 세부 정보 페이지에서 숨겨진 필드가 올바르게 바인딩되어 있고 심지어 값이 할당되었지만 양식이 제출 될 때이 문제에 직면하고 있는지 잘 모르겠습니다.

해결법

  1. ==============================

    1.LazyMap 팩토리는 LazyList를 반환해야합니다.

    LazyMap 팩토리는 LazyList를 반환해야합니다.

    FactoryUtils.instantiateFactory (PrsCDData.class) 지정된 팩토리는 PrsCDData 목록이 아닌 새 PrsCDData 객체를 생성합니다.

    prsCDData['Forced'] -> if exists then return it else create instance of PrsCDData.class
    

    해야한다

    prsCDData['Forced'] -> if exists then return it else create instance of LazyList<PrsCDData>
    

    당신이 즉시 ArrayIndexOutOfBoundsExecption으로 인도하는 인덱스 '0'에 접근하기를 원하기 때문에 LazyList를 사용하라.

    편집 : 간단한 예제

    public class Test {
    
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws UnsupportedEncodingException {
    
        Map<String, List<SimpleBean>> map = MapUtils.lazyMap(new HashMap<String,List<Object>>(),new Factory() {
    
            public Object create() {
                return LazyList.decorate(new ArrayList<SimpleBean>(), FactoryUtils.instantiateFactory(SimpleBean.class));
            }
        });
    
        System.out.println(map.get("test").get(0));
    }
    
    public static class SimpleBean {
        private String name;
    }
    
    }
    
  2. from https://stackoverflow.com/questions/12348491/unable-to-bind-data-using-spring-data-functionality by cc-by-sa and MIT license