Skip to content

Commit f0e2408

Browse files
committed
fix(api): ensure JsonObjectBuilder consistency during logging and response creation #11717
- Cloned JsonObjectBuilder to prevent unintended mutation - Simplified metadata construction logic in logging - This should allow us to no longer have HTML Error 500 pages, but a nicer JSON response.
1 parent 76db4cb commit f0e2408

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

src/main/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilder.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package edu.harvard.iq.dataverse.api.util;
22

33
import jakarta.json.Json;
4+
import jakarta.json.JsonObject;
45
import jakarta.json.JsonValue;
56
import jakarta.json.JsonObjectBuilder;
67
import jakarta.servlet.ServletResponse;
@@ -143,8 +144,9 @@ public JsonResponseBuilder internalError(Throwable ex) {
143144
* @return JAX-RS response including JSON message
144145
*/
145146
public Response build() {
147+
JsonObject entity = entityBuilder.build();
146148
return jerseyResponseBuilder.type(MediaType.APPLICATION_JSON_TYPE)
147-
.entity(this.entityBuilder.build())
149+
.entity(entity)
148150
.build();
149151
}
150152

@@ -215,9 +217,14 @@ public JsonResponseBuilder log(Logger logger, Level level, Optional<Throwable> e
215217
if ( ! logger.isLoggable(level) || alreadyLogged )
216218
return this;
217219

218-
StringBuilder metadata = new StringBuilder("");
219-
this.entityBuilder.build()
220-
.forEach((k,v) -> metadata.append("_"+k+"="+v.toString()+";"));
220+
// This is necessary because we need to build in two places: logging and response creation.
221+
// Without cloning the object builder, we'd end up with an empty entity in the response when logging before that.
222+
JsonObject entity = this.entityBuilder.build();
223+
this.entityBuilder = Json.createObjectBuilder(entity);
224+
225+
StringBuilder metadata = new StringBuilder();
226+
entity.forEach((k,v) -> metadata.append("_").append(k).append("=").append(v.toString()).append(";"));
227+
221228
// remove trailing ;
222229
metadata.deleteCharAt(metadata.length()-1);
223230

0 commit comments

Comments
 (0)