Skip to content

Commit 1fabfe0

Browse files
Serialize values for debug output safely in AbstractMongoEventListener.
We now make sure that codec configuration will not cause an exception when debug logging is turned on. Resolves: #3968 Original Pull Request: #3970
1 parent 1849afd commit 1fabfe0

File tree

3 files changed

+25
-8
lines changed

3 files changed

+25
-8
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AbstractMongoEventListener.java

+8-7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.slf4j.LoggerFactory;
2020
import org.springframework.context.ApplicationListener;
2121
import org.springframework.core.GenericTypeResolver;
22+
import org.springframework.data.mongodb.core.query.SerializationUtils;
2223

2324
/**
2425
* Base class to implement domain class specific {@link ApplicationListener}s.
@@ -103,7 +104,7 @@ public void onApplicationEvent(MongoMappingEvent<?> event) {
103104
public void onBeforeConvert(BeforeConvertEvent<E> event) {
104105

105106
if (LOG.isDebugEnabled()) {
106-
LOG.debug("onBeforeConvert({})", event.getSource());
107+
LOG.debug("onBeforeConvert({})", SerializationUtils.serializeToJsonSafely(event.getSource()));
107108
}
108109
}
109110

@@ -116,7 +117,7 @@ public void onBeforeConvert(BeforeConvertEvent<E> event) {
116117
public void onBeforeSave(BeforeSaveEvent<E> event) {
117118

118119
if (LOG.isDebugEnabled()) {
119-
LOG.debug("onBeforeSave({}, {})", event.getSource(), event.getDocument());
120+
LOG.debug("onBeforeSave({}, {})", SerializationUtils.serializeToJsonSafely(event.getSource()), SerializationUtils.serializeToJsonSafely(event.getDocument()));
120121
}
121122
}
122123

@@ -129,7 +130,7 @@ public void onBeforeSave(BeforeSaveEvent<E> event) {
129130
public void onAfterSave(AfterSaveEvent<E> event) {
130131

131132
if (LOG.isDebugEnabled()) {
132-
LOG.debug("onAfterSave({}, {})", event.getSource(), event.getDocument());
133+
LOG.debug("onAfterSave({}, {})", SerializationUtils.serializeToJsonSafely(event.getSource()), SerializationUtils.serializeToJsonSafely(event.getDocument()));
133134
}
134135
}
135136

@@ -142,7 +143,7 @@ public void onAfterSave(AfterSaveEvent<E> event) {
142143
public void onAfterLoad(AfterLoadEvent<E> event) {
143144

144145
if (LOG.isDebugEnabled()) {
145-
LOG.debug("onAfterLoad({})", event.getDocument());
146+
LOG.debug("onAfterLoad({})", SerializationUtils.serializeToJsonSafely(event.getDocument()));
146147
}
147148
}
148149

@@ -155,7 +156,7 @@ public void onAfterLoad(AfterLoadEvent<E> event) {
155156
public void onAfterConvert(AfterConvertEvent<E> event) {
156157

157158
if (LOG.isDebugEnabled()) {
158-
LOG.debug("onAfterConvert({}, {})", event.getDocument(), event.getSource());
159+
LOG.debug("onAfterConvert({}, {})", SerializationUtils.serializeToJsonSafely(event.getDocument()), SerializationUtils.serializeToJsonSafely(event.getSource()));
159160
}
160161
}
161162

@@ -168,7 +169,7 @@ public void onAfterConvert(AfterConvertEvent<E> event) {
168169
public void onAfterDelete(AfterDeleteEvent<E> event) {
169170

170171
if (LOG.isDebugEnabled()) {
171-
LOG.debug("onAfterDelete({})", event.getDocument());
172+
LOG.debug("onAfterDelete({})", SerializationUtils.serializeToJsonSafely(event.getDocument()));
172173
}
173174
}
174175

@@ -181,7 +182,7 @@ public void onAfterDelete(AfterDeleteEvent<E> event) {
181182
public void onBeforeDelete(BeforeDeleteEvent<E> event) {
182183

183184
if (LOG.isDebugEnabled()) {
184-
LOG.debug("onBeforeDelete({})", event.getDocument());
185+
LOG.debug("onBeforeDelete({})", SerializationUtils.serializeToJsonSafely(event.getDocument()));
185186
}
186187
}
187188
}

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/AbstractMongoEventListenerUnitTests.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@
1717

1818
import static org.assertj.core.api.Assertions.*;
1919

20+
import java.time.Instant;
21+
2022
import org.bson.Document;
2123
import org.junit.jupiter.api.Test;
22-
2324
import org.springframework.context.support.AbstractApplicationContext;
2425
import org.springframework.context.support.ClassPathXmlApplicationContext;
2526
import org.springframework.data.mongodb.core.mapping.Account;
2627
import org.springframework.data.mongodb.repository.Contact;
2728
import org.springframework.data.mongodb.repository.Person;
2829

30+
import com.mongodb.BasicDBObject;
31+
2932
/**
3033
* Unit tests for {@link AbstractMongoEventListener}.
3134
*
@@ -154,6 +157,14 @@ public void donInvokePersonCallbackForUntypedEvent() {
154157
assertThat(listener.invokedOnBeforeDelete).isFalse();
155158
}
156159

160+
@Test // GH-3968
161+
public void debugLogShouldNotFailMongoDBCodecError() {
162+
163+
MongoMappingEvent<BasicDBObject> event = new BeforeConvertEvent<>(new BasicDBObject("date", Instant.now()), "collection-1");
164+
UntypedEventListener listener = new UntypedEventListener();
165+
listener.onApplicationEvent(event);
166+
}
167+
157168
class SamplePersonEventListener extends AbstractMongoEventListener<Person> {
158169

159170
boolean invokedOnBeforeConvert;

spring-data-mongodb/src/test/resources/logback.xml

+5
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@
77
</encoder>
88
</appender>
99

10+
<appender name="no-op" class="ch.qos.logback.core.helpers.NOPAppender" />
11+
1012
<!--
1113
<logger name="org.springframework" level="debug" />
1214
-->
1315

1416
<logger name="org.springframework.data.mongodb.core" level="error"/>
17+
<logger name="org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener" level="debug" additivity="false">
18+
<appender-ref ref="no-op" />
19+
</logger>
1520
<logger name="org.springframework.data.mongodb.test.util" level="info"/>
1621

1722
<root level="error">

0 commit comments

Comments
 (0)