小编sch*_*hau的帖子

由于使用 Jackson 将 Java 对象序列化为字符串而导致 OutOfMemoryError

我正在使用ObjectMapperJackson 将 Java 对象转换为字符串,以便将其写入我的日志文件中。
转换方法如下所示:

private String getResponseAsString(OrderResponse response) {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.writeValueAsString(response);
        } catch (JsonProcessingException e) {
            log.error("Error when converting response:" + getExceptionMessage(e));
            return "Error when converting response";
        }
}
Run Code Online (Sandbox Code Playgroud)

运行程序后,我发现它OutOfMemoryError: Java Heap Space在此方法上引发了错误:

抛出异常所以我认为我的程序内存不足。我读过一些文章,说我可以通过增加内存来解决这个问题。但现在当我检查设置时,我的计算机中的默认Xmx已经接近 4GB,所以我不想再增加它。

谁能给我一个提示,如何通过将对象转换为字符串方法替换为具有相同功能的另一个方法来节省内存?或者有人有其他想法/方法来克服这个问题。

java out-of-memory jackson

7
推荐指数
1
解决办法
6122
查看次数

如何模拟 KafkaTemplate 的结果

我有一种发送 kafka 消息的方法,如下所示:

@Async
public void sendMessage(String topicName, Message message) {
    ListenableFuture<SendResult<String, Message >> future = kafkaTemplate.send(topicName, message);

    future.addCallback(new ListenableFutureCallback<>() {

        @Override
        public void onSuccess(SendResult<String, Message > result) {
            //do nothing
        }

        @Override
        public void onFailure(Throwable ex) {
            log.error("something wrong happened"!);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

现在我正在为它编写单元测试。我还想测试这两个回调方法onSuccess和onFailure方法,所以我的想法是模拟 KafkaTemplate,例如:

KafkaTemplate kafkaTemplate = Mockito.mock(KafkaTemplate.class);
Run Code Online (Sandbox Code Playgroud)

但是现在我陷入了这两种情况的模拟结果上:

when(kafkaTemplate.send(anyString(), any(Message.class))).thenReturn(????);
Run Code Online (Sandbox Code Playgroud)

我应该thenReturn在案例成功和案例失败的方法中放什么?请问有人有什么想法吗?非常感谢!

spring-kafka

6
推荐指数
1
解决办法
5837
查看次数

处理Collectors.toMap()函数中的重复键

我正在创建一个地图,其(键,值)将在我的Person对象中(名称,地址):

Map<String, String> myMap = persons.stream.collect(Collector.toMap(person.getName(), person.getAddress(), (address1, address2) -> address1));
Run Code Online (Sandbox Code Playgroud)

在重复键情况下,我想跳过将第二个地址添加到地图中,并希望也记录该名称.跳过重复的地址我已经可以使用mergeFunction,但是在oder中记录我在这个mergeFunction中需要的名称person对象,如:

(address1, address2) -> {
                           System.out.println("duplicate "+person.name() + " is found!");
                           return address1;
                        }
Run Code Online (Sandbox Code Playgroud)

我通过将person对象传递给此合并函数而陷入困境.有人能给我一些提示吗?先谢谢你!

java hashmap java-8 java-stream

5
推荐指数
3
解决办法
2486
查看次数

Spring Security 中的 hasRole() 和 hasAuthority() 有什么区别

假设我有一个用户具有以下身份验证:

 List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
 grantedAuthorities.add(new SimpleGrantedAuthority("READ_PRODUCT"));
 grantedAuthorities.add(new SimpleGrantedAuthority("WRITE_PRODUCT"));

 SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken("usr", "pwd", grantedAuthorities));
Run Code Online (Sandbox Code Playgroud)

在安全检查中,我应该检查用户是否具有访问 API 的正确权限。我做了以下事情来实现它:

 http
    .httpBasic().disable()
    .authorizeRequests()
    .antMatchers(HttpMethod.GET, "/product/**").hasAuthority("READ_PRODUCT");
Run Code Online (Sandbox Code Playgroud)

这里我hasAuthority()用来检查用户是否有正确的权限,但是我发现还有一个方法被调用了hasRole()但是我不知道这两个方法的区别是什么?谁能解释我的区别,如果我想在hasRole()这里使用,我如何在这里使用它?我试图替换hasAuthority()为hasRole()但没有成功

spring-security

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

如何从MockMvc中的jsonPath()中检索字符串

我想比较两个jsonPath值是否相等,如下所示:

this.mockMvc.perform(get(requestURL)).andExpect(jsonPath("$.prop1", equalTo(jsonPath("$.prop2"))));
Run Code Online (Sandbox Code Playgroud)

但后来我的测试失败了。该(“ $为prop1”)jsonPath返回正确的价值我想要的,但jsonPath(“$ PROP2。”)不返回该属性的值,而不是像类名:

org.springframework.test.web.servlet.result.JsonPathResultMatchers@7b7aaaf6

谁能给我个主意,我如何执行jsonPath()的toString()方法?我也尝试了jsonPath(“ $。prop2”)。toString(),但也收到了类名。

谢谢高级!

spring mocking jsonpath

4
推荐指数
1
解决办法
1515
查看次数