복붙노트

[SPRING] 자식 스프링 객체와 그것의 슈퍼 java.util 객체 사이의 명시 적 유형 변환

SPRING

자식 스프링 객체와 그것의 슈퍼 java.util 객체 사이의 명시 적 유형 변환

봄에 나는 jdbcTemplate을 사용하고 있지만 목록을 쿼리 할 때 Linkedcaseinsensitivemap을 반환 할 때 다음과 같은 경우에도 여전히 linkscaseinsensitivemap을 얻을 수있다. 자바 util 목록으로 캐스팅하고 왼쪽의 java.util.List로서의 할당

첫째, 그게 어떻게 가능할까요?

final java.util.List<Map<String, Object>> list = (java.util.List<Map<String, Object>>) jdbc
          .queryForList("SELECT * FROM customer");

그래서, 어떻게 이런 유형의 업 캐스팅을 할 수 있습니까? 두 번째 목록을 선언 할 필요없이 메모리를 할당 한 다음 객체를 java.util.List에 수동으로 넣을 수 있습니까?

LinkedCaseInsensitive가 자바 객체를 서브 클래 싱하기 때문에, 임은 자바 객체 인 슈퍼 객체로 어떻게 캐스팅해야하는지 알아내는 데 어려움을 겪고있다. 이것을 달성하는 방법은 현재로서는 수수께끼입니다.

현재 어떤 브로커가 AMQ를 사용할지를 알 수있는 방법이 없기 때문에 목표는 너무 엄격하게 jms 객체에 보관되며, 그래서 봄 객체를 보내기 시작할 수 없습니다. 왜냐하면 jms가 표준이되어야하고, AMQProtocol을 구현할 수있는 옵션이 없기 때문에 기본 자바 객체를 보내야합니다.

JSON으로의 직렬 연결이 제안되었으므로이 경우 작동하지 않는 이유에 대해 설명하고, Notes 문서에 넣을 것이므로 리시버에 "현재 상태의"개체를 보내야합니다.

for (int i = 1; i <= metadata.getColumnCount(); i++) {
                String columnName = metadata.getColumnName(i);
                Object values = sqlConnection.getRset().getObject(i);
                doc.replaceItemValue(columnName, values);

}

그래서 SO'ers, 어떻게 하나 더 아름다운 일을 달성합니까? 도와주세요 미리 감사드립니다!

해결법

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

    1.SQL select는 여러 행을 반환 할 수 있으며 각 행에는 여러 개의 선택된 열이 있습니다. 호출중인 queryForList 메소드는 선택된 각 행에 대해 맵 맵핑 C 럼 이름을 C 럼 값과 함 2 가진 List를 리턴합니다.

    SQL select는 여러 행을 반환 할 수 있으며 각 행에는 여러 개의 선택된 열이 있습니다. 호출중인 queryForList 메소드는 선택된 각 행에 대해 맵 맵핑 C 럼 이름을 C 럼 값과 함 2 가진 List를 리턴합니다.

    Map과 List는 인터페이스이므로 Spring은 원하는 구현을 자유롭게 선택할 수 있습니다. 이 맵은 삽입 순서대로 키를 나열하기 때문에 Map에 대해 LinkedCaseInsensitiveHashMap을 선택합니다. 따라서 열이 선택된 순서는 손실되지 않습니다.

    결과 목록을 거의 알지 못하는 수신기로 보내려면 JSON으로 직렬화하여 텍스트 메시지로 보내면됩니다.

    Gson 또는 Jackson2와 같은 라이브러리를 사용하여 JSON에 직렬화 할 수 있습니다. serializer를 만들고 문자열로 변환 할 객체를 피드로 제공합니다. 예를 들어 Gson에서 serializer 클래스의 Gson은 다음과 같습니다.

    TextMessage message;
    // initialize message and headers however you like
    // then serialize it to String:
    Gson gson = new Gson();
    String json = gson.toJson(list);
    // and set it in the message:
    message.setText(json);
    

    (또한 Spring JmsTemplate이 JSON으로 변환하는 MessageConverter를 사용하여이 작업을 수행하도록 할 수 있지만 작업하기가 조금 더 어렵다고 생각할 수 있습니다.)

    또는, ObjectMessage로 전송하는 맵을 사용자 정의하려는 경우, 원하는 쿼리의 java.util.Map 구현을 작성하는 사용자 정의 RowMapper를 지정할 수있는 다른 쿼리 메소드를 사용할 수 있습니다. TreeMap을 사용하면 알파벳순으로 열을 정렬하고 HashMap을 사용하면 임의의 순서로 정렬합니다.

    그런 다음 수신기는 JSON을 Java 객체로 다시 압축 해제 할 수 있습니다. gson.fromGson (json)은지도 목록을 반환합니다.

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

    2.이 방법을 사용하여 자식 개체를 부모 클래스로 만드는 방법을 알아 냈습니다. 설명 된 시나리오에서 다음을 수행합니다.

    이 방법을 사용하여 자식 개체를 부모 클래스로 만드는 방법을 알아 냈습니다. 설명 된 시나리오에서 다음을 수행합니다.

    final java.util.ArrayList<java.util.Map<String, Object>> javaList = new java.util.ArrayList<java.util.Map<String, Object>>();
            final java.util.List<java.util.Map<String, Object>> list = jdbc
                      .queryForList("SELECT * FROM customer");
            javaList.addAll(list);
    

    그러나 나에게 좋지 않은데, 어떻게 이것을 더 올바른 방법으로 달성 할 수 있을까요?

  3. from https://stackoverflow.com/questions/30378061/explicit-type-conversion-between-child-spring-object-and-its-super-java-util-o by cc-by-sa and MIT license