2010-07-02 3 views
2

bean에 중첩 된 특성 인 문자열 플랫 맵 < 문자열의 전체 복사본을 만드는 가장 간단한 방법을 찾고 있습니다. 중첩 된 속성 중 일부는 인스턴스화를위한 전략을 제공하고자하는 인터페이스입니다. 예를 들어,null 속성 인스턴스화를위한 전략이있는 딥 빈 복사본

Map<String, String> customer = new Map<String, String>(); 
customers.put("id", "123"); 
customers.put("address.line1", "221B Baker St."); 

public class Customer { 
    private int id; 
    private Address address; //address is an interface 
    ... getters/setters ... 
} 

명시적인 매핑을 제공하고 싶지는 않습니다. 인터페이스에 구체적인 인스턴스를 제공하기위한 전략 일뿐입니다. 나는 이것을 commons-beanutils로 생각했지만, 그것들은 기능을위한 열린 티켓 JIRA이다. 유사한 기능을 가진 라이브러리는 InstanceCreator이라는 인터페이스를 제공하는 Google GSON입니다.

나는 beanutils 위에 솔루션을 구현했지만이 기능이 내장 된 bean 변환 라이브러리가 있습니까?

답변

0

당신은 두 가지 다른 것을 표현하고 있습니다. 더 쉽게 할 일은 당신이 처음에 묘사 한 것, 깊게 중첩 된 문자열지도 일 것입니다. 그래서

put("id", "1") -> map.put("id", "1") 
put("address.line1", "221b") -> ((Map)map.get("address")).put("221B") 

는 (지도가 들어 옹알 옹알, 우리가하는 모든 사람들 일들이 일을하는 자바의 간결 방법을 사랑 초기화하기 만약 그렇다면 나는, 간결 실제 안전 점검을 무시하고 있습니다.)

그리고 "abcd .."를 넣으면 재귀 적으로 "."

실제로 "주소"를 원하면 (예제에서 Address 클래스를 참조하기 때문에) Address 유형의 객체를 참조하기 위해서는 좀 더 복잡합니다. 접두사를 클래스로 인식하는 무언가가 필요합니다. 이는 맵에 응답하는 사용자 정의가 바람직합니다. 인터페이스는 트리를 탐색 할 때 쉽게 인스턴스화 될 수 있으며 입력 문자열에서 자체 개체를 생성하는 방법을 알고 있습니다.

내가 처음으로 구현 한 beanutils의 세부 사항에 대해 잘 모르겠다. 작성하기가 너무 어렵지 않다. 그러나 문자열의 중첩 된지도는 쉽습니다. 해시 맵과 문자열이 직렬화되기 때문에 직렬화로 쉽게 포장 할 수 있습니다. 또는 json 라이브러리로 문제가 전혀없는 중첩 된 문자열 맵을 사용해야합니다 (google gson은 잘 작동합니다).

+0

귀하의 의견에 따라 약간의 질문을 수정했습니다. 난 중첩 된 속성의 평면 맵만 처리하려고합니다. 또한 Google GSON을 살펴보면 InstanceCreator라는 개념을 찾고 있는데, map -> json 대신 map -> bean을 사용한다는 것을 제외하고는 제가 찾고있는 개념입니다. –

0

나는 이것이 당신보다 더 어려울 수도 있다고 생각합니다. 내가 할 일은 마크 업 또는 다른 형식으로 직렬화하는 것입니다. 귀하의 요구 사항은 무엇인지 모르겠지만 JAXB, XStream 등 모든 우수한 마샬 러가이 작업을 수행합니다.

@XmlRootElement(name="customer") 
public class Customer 
{ 
    private int id; 
    private Address address; 
} 

@XmlRootElement(name="address") 
public class Address 
{ 
    private String city; 
} 

다음과 같은 XML을 : : 당신이 뭔가를 할 수 JAXB와 함께

<customer> 
    <id>1234</id> 
    <address> 
     <city>Kansas City</city> 
    </address> 
</customer> 

... 정렬 화하고 이리저리 비 정렬 화 될 수있다. 또한, JAXB 마샬 (예 저지-JSON 등)의 여러 다른 구현이있다, 그래서 당신은 다른 형식으로 마샬 수 :

{ 
    "customer": 
    { 
     "id":1234, 
     "address": 
     { 
      "city":"Kansas City" 
     } 
    } 
} 

당신이지도를 사용할 필요가 왜 특별한 이유가 있나요? 그렇지 않다면, 당신은 단지 복잡한 Reflections 유틸리티이며, 아마도 GSON 라이브러리와 같은 것이 복잡성을 촉진 할 수 있다고 생각합니다.

편집 : 매핑을 원하지 않는 것에 대한 귀하의 광고를 보았는데 ... 나는 그 사실을 정말로 이해하지 못합니다.직렬화를 사용한 후에 비슷한 것을하는 다른 방법은 가치가없는 것 같습니다.

+0

저는 이미 속성을 복사해야하는 수많은 bean이있는 데모를 만들고 있습니다. 이미 데이터를 평면 인덱스 맵으로 가지고 있습니다. 그것은 문서 저장소에서 나옵니다. 확실히 JSON을 사용할 수는 있지만 이미 다른 형식의 데이터가있는 것을 보면서 필자가 가지고 있던 데이터를 사용하고 싶습니다. 제작 목적으로이 글을 쓸 때 데이터를 매핑하는 데 다른 방법을 사용할 것입니다. –