相关疑难解决方法(0)

将LinkedHashMap转换为复杂对象

我有一个应用程序,它使用Jackson将一些数据存储在DynamoDB中,以便将我的复杂对象编组为JSON.

例如,我正在编组的对象可能如下所示:

private String aString;
private List<SomeObject> someObjectList;
Run Code Online (Sandbox Code Playgroud)

SomeObject可能如下所示:

private int anInteger;
private SomeOtherObject;
Run Code Online (Sandbox Code Playgroud)

和SomeOtherObject可能如下所示:

private long aLong;
private float aFloat; 
Run Code Online (Sandbox Code Playgroud)

这很好,对象被编组没有问题,并作为JSON字符串存储在DB中.

当需要从DynamoDB检索数据时,Jackson会自动检索JSON并将其转换回来...除了'someObjectList'返回的List<LinkedHashMap>不是List<SomeObject>!这是杰克逊的标准行为,这不是一个错误.

所以现在这会导致问题.我的代码库认为它处理一个List<SomeObject>但现实是它处理一个List<LinkedHashMap>!我的问题是如何让我的LinkedHashMap回到'SomeObject'.显然这是一个手动过程,但我的意思是我甚至无法提取值.

如果我这样做:

for (LinkedHashMap lhm : someObjectList) {
    // Convert the values back
}
Run Code Online (Sandbox Code Playgroud)

我收到一个编译错误,告诉我someObjectList的类型为'SomeObject'而不是LinkedHashMap.

如果我这样做:

for (SomeObject lhm : someObjectList) {
    // Convert the values back
}
Run Code Online (Sandbox Code Playgroud)

我收到运行时错误,告诉我LinkedHashMap无法转换为'SomeObject'.

java casting linkedhashmap jackson

51
推荐指数
2
解决办法
7万
查看次数

Spring RestTemplate和泛型类型ParameterizedTypeReference集合,如List <T>

Abstract控制器类需要REST中的对象列表.使用Spring RestTemplate时,它不会将其映射到所需的类,而是返回Linked HashMAp

 public List<T> restFindAll() {

    RestTemplate restTemplate = RestClient.build().restTemplate();
    ParameterizedTypeReference<List<T>>  parameterizedTypeReference = new ParameterizedTypeReference<List<T>>(){};
    String uri= BASE_URI +"/"+ getPath();

    ResponseEntity<List<T>> exchange = restTemplate.exchange(uri, HttpMethod.GET, null,parameterizedTypeReference);
    List<T> entities = exchange.getBody();
    // here entities are List<LinkedHashMap>
    return entities;

}
Run Code Online (Sandbox Code Playgroud)

如果我用,

ParameterizedTypeReference<List<AttributeInfo>>  parameterizedTypeReference = 
    new ParameterizedTypeReference<List<AttributeInfo>>(){};
    ResponseEntity<List<AttributeInfo>> exchange =
  restTemplate.exchange(uri, HttpMethod.GET, null,parameterizedTypeReference);
Run Code Online (Sandbox Code Playgroud)

它工作正常.但不能放入所有子类,任何其他解决方案.

java resttemplate spring-web spring-rest

26
推荐指数
3
解决办法
3万
查看次数

Spring websocket @messagemapping反序列化问题java.lang.ClassCastException:java.util.LinkedHashMap无法强制转换

我正在客户端用StompJS编写一个spring websocket应用程序.

在客户端,我打算发送一个对象列表,并在服务器端映射到java对象时,它将自身转换为LinkedHashMap

我的客户端代码是

function stomball() {
         stompClient.send("/brkr/call", {}, JSON.stringify(listIds));
     }
Run Code Online (Sandbox Code Playgroud)

Listids看起来像

[{
    "path": "/a/b/c.txt",
    "id": 12
}, {
    "path": "/a/b/c/d.txt",
    "id": 13
}]
Run Code Online (Sandbox Code Playgroud)

List Id对象看起来像

public class ListId {

    private String path;

    private Long id;

    //getters and setters...
}
Run Code Online (Sandbox Code Playgroud)

控制器看起来像这样

@MessageMapping("/call" )
@SendTo("/topic/showResult")
public RetObj process(List<ListId> listIds) {
   if (!listIds.isEmpty()) {
        for(ListId listId: listIds) {

        }
}
Run Code Online (Sandbox Code Playgroud)

所以我得到一个java.lang.ClassCastException:java.util.LinkedHashMap无法强制转换为com.blah.ListId

然而,当我使用RestMapping使用普通的Spring控制器时,它工作正常,是否有任何弹簧MessageMapping注释将对象映射到java的方式与传统方式不同我不知道为什么不转换为ListID

java stomp spring-websocket stompjs

5
推荐指数
1
解决办法
1025
查看次数