2014-10-15 3 views
2

나는 아약스 통화에서 주문 문자열의 목록을 반환해야스프링 MVC 잭슨 주문

내 DTO는이 문자열 값의 목록입니다 크기, 예를 들어 속성이있다 : 36,38,40/46, 46 , S, XS, M, L

내 비교 자 및 정렬 알고리즘이 잘 작동하면 크기 목록이 json 형식으로 변환 될 때까지 정렬됩니다. 완전히 다른 순서를 찾았습니다.

@ResponseBody 
@RequestMapping(value = PRODUCT_CODE_PATH_VARIABLE_PATTERN + "/crossell", method = RequestMethod.GET) 
public ProductData cosselProductDetail(@PathVariable("productCode") final String productCode, 
     final HttpServletResponse response) throws CMSItemNotFoundException, 
     UnsupportedEncodingException 
{ 

    Collections.sort(sortedSizes,mycomparator); 
    productData.setSizes(sortedSizes); 
    return productData; 
} 

스프링 설정은 어떤 일이 추가되거나 수정 된 기본 구성입니다. SORT_PROPERTIES_ALPHABETICALLY, 속성이 아닌 값을 주문 :

<!-- activates annotation driven binding --> 
<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" validator="validator"> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/> 
     <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/> 
     <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

은 주위를 검색 한 후, 내가 발견 한 것은 모두 직렬화 키 설정입니다.

감사

+0

'productData.sizes'의 유형은 무엇입니까? – ponomandr

+0

간단한 목록

+1

주문이 실제 JSON이 아닌 경우에는 여기에서 자세히 설명하는 강력한 주장이 있습니다. http://stackoverflow.com/questions/4515676/keep-the-order-of-json-keys-during -json-conversion-to-csv/4515863 # 4515863 슬프지만, 기본 구성은 변환 후 순서를 유지할 것으로 예상됩니다. 그래서 물어 보니 용서해주십시오.하지만 그게 당신이 정렬을 잃는 지점이라고 확신합니까? 또한 디버거에서 (디버거에서) 크기 목록의 구체적인 구현이 무엇인지 붙여 넣을 수 있습니까? –

답변

1

그것을하지 대답은,하지만 난 그 '형식의 쉽게 일으킬처럼 게시하도록하겠습니다. LinkedHashMap에 관계없이 직렬화가 순서를 유지할 것이라고 저는 믿습니다. 궁금했다 그래서 나는이 같은 몇 가지 유사한 예를 입력 :

@ResponseBody 
@RequestMapping(value = "/crossel", method = RequestMethod.GET) 
public ProductData cosselProductDetail() { 

    List<String> sortedSizes = new LinkedList<>(); 
    sortedSizes.add("11"); 
    sortedSizes.add("8"); 
    sortedSizes.add("10"); 
    sortedSizes.add("15"); 
    sortedSizes.add("20"); 
    sortedSizes.add("5"); 
    sortedSizes.add("3"); 
    sortedSizes.add("7"); 
    sortedSizes.add("40"); 
    Map<String, String> linkedHS = new LinkedHashMap<>(); 
    Collections.sort(sortedSizes, new ValueComparator(linkedHS)); 
    for (String key : sortedSizes) { 
     linkedHS.put(key, "test"); 
    } 
    ProductData productData = new ProductData(); 
    productData.setSizes(linkedHS); 
    return productData; 
} 

class SizeComparator implements Comparator<String> { 

    @Override 
    public int compare(String e1, String e2) { 
     if (e1.length() == 1) e1 = "0" + e1; 
     if (e2.length() == 1) e2 = "0" + e2; 
     return e1.compareTo(e2); 
    } 
} 


class ProductData { 
    Map<String, String> sizes; 

    public Map<String, String> getSizes() { 
     return sizes; 
    } 

    public void setSizes(Map<String, String> sizes) { 
     this.sizes = sizes; 
    } 
} 

을하고이

{"sizes":{"3":"test","5":"test","7":"test","8":"test","10":"test","11":"test","15":"test","20":"test","40":"test"}} 

를 반환하고 키를 사용자 정의 분류되어 명심하십시오. 따라서 스프링 MVC 3.2 +에서는 기본 설정을 다소간 유지하면서 주문을 보존 할 것으로 기대합니다. 코드를 게시하고, 질문을 부풀게하는 것에 대해 걱정하지 마시고 수정 가능해야합니다.