Skip to content
Permalink

Comparing changes

This is a direct comparison between two commits made in this repository or its related repositories. View the default comparison for this range or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: palantir/dialogue
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: cbb81e32d07286e7216e1a6ab7fb102b1da24639
Choose a base ref
..
head repository: palantir/dialogue
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 9cf53e98b3da54287af747d8c8ca8483623801b8
Choose a head ref
Original file line number Diff line number Diff line change
@@ -63,11 +63,6 @@ private Optional<Object> constructEmptyInstance(Type type, TypeMarker<?> origina
return jacksonInstance;
}

Method noArgStaticFactoryMethod = getFirstNoArgCreatorStaticMethod(type);
if (noArgStaticFactoryMethod != null) {
return invokeNoArgStaticFactoryMethod(noArgStaticFactoryMethod);
}

// fallback to manual reflection to handle aliases of optionals (and aliases of aliases of optionals)
Method method = getJsonCreatorStaticMethod(type);
if (method != null) {
@@ -157,32 +152,6 @@ private static Method getJsonCreatorStaticMethod(Type type) {
return null;
}

@Nullable
private static Method getFirstNoArgCreatorStaticMethod(Type type) {
if (type instanceof Class) {
Class<?> clazz = (Class<?>) type;
for (Method method : clazz.getMethods()) {
if (Modifier.isStatic(method.getModifiers())
&& method.getParameterCount() == 0
&& method.getAnnotation(JsonCreator.class) != null) {
return method;
}
}
}
return null;
}

private static Optional<Object> invokeNoArgStaticFactoryMethod(Method method) {
try {
return Optional.ofNullable(method.invoke(null));
} catch (IllegalAccessException | InvocationTargetException e) {
if (log.isDebugEnabled()) {
log.debug("Reflection instantiation failed", e);
}
return Optional.empty();
}
}

private static Optional<Object> invokeStaticFactoryMethod(Method method, Object parameter) {
try {
return Optional.ofNullable(method.invoke(null, parameter));
Original file line number Diff line number Diff line change
@@ -20,14 +20,15 @@
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.google.common.collect.ImmutableList;
import com.palantir.conjure.java.api.errors.ErrorType;
import com.palantir.conjure.java.api.errors.RemoteException;
import com.palantir.conjure.java.api.errors.SerializableError;
import com.palantir.conjure.java.api.errors.ServiceException;
import com.palantir.conjure.java.dialogue.serde.EndpointErrorTestUtils.CustomNullDeserializer;
import com.palantir.conjure.java.serialization.ObjectMappers;
import com.palantir.dialogue.BinaryRequestBody;
import com.palantir.dialogue.BodySerDe;
@@ -72,10 +73,13 @@ public void testRequestOptionalEmpty() {

@Test
public void testRequestCustomEmpty() {
@JsonDeserialize(using = EmptyRecord.EmptyRecordDeserializer.class)
record EmptyRecord() {
@JsonCreator
public static EmptyRecord create() {
return new EmptyRecord();
private static final class EmptyRecordDeserializer extends CustomNullDeserializer<EmptyRecord> {
@Override
public EmptyRecord create() {
return new EmptyRecord();
}
}
}
TestResponse response = new TestResponse().code(204);
Original file line number Diff line number Diff line change
@@ -17,6 +17,9 @@
package com.palantir.conjure.java.dialogue.serde;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.palantir.conjure.java.api.errors.CheckedServiceException;
import com.palantir.dialogue.TypeMarker;
import com.palantir.logsafe.Arg;
@@ -58,6 +61,20 @@ abstract static class EndpointError<T> {
}
}

abstract static class CustomNullDeserializer<T> extends JsonDeserializer<T> {
public abstract T create();

@Override
public T deserialize(JsonParser _parser, DeserializationContext _ctxt) {
return create();
}

@Override
public T getNullValue(DeserializationContext _ctxt) {
return create();
}
}

record ConjureError(
@JsonProperty("errorCode") String errorCode,
@JsonProperty("errorName") String errorName,
Original file line number Diff line number Diff line change
@@ -23,13 +23,15 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.google.common.collect.ImmutableList;
import com.palantir.conjure.java.api.errors.CheckedServiceException;
import com.palantir.conjure.java.api.errors.ErrorType;
import com.palantir.conjure.java.api.errors.RemoteException;
import com.palantir.conjure.java.api.errors.SerializableError;
import com.palantir.conjure.java.dialogue.serde.EndpointErrorTestUtils.ConjureError;
import com.palantir.conjure.java.dialogue.serde.EndpointErrorTestUtils.ContentRecordingJsonDeserializer;
import com.palantir.conjure.java.dialogue.serde.EndpointErrorTestUtils.CustomNullDeserializer;
import com.palantir.conjure.java.dialogue.serde.EndpointErrorTestUtils.EndpointError;
import com.palantir.conjure.java.dialogue.serde.EndpointErrorTestUtils.TypeReturningStubEncoding;
import com.palantir.conjure.java.serialization.ObjectMappers;
@@ -63,12 +65,14 @@ public class EndpointErrorsConjureBodySerDeTest {
private sealed interface EmptyBodyEndpointReturnBaseType permits EmptyReturnValue, ErrorReturnValue {}

@Generated("by conjure-java")
@JsonDeserialize(using = EmptyReturnValue.EmptyReturnValueDeserializer.class)
record EmptyReturnValue() implements EmptyBodyEndpointReturnBaseType {
@JsonCreator
public static EmptyReturnValue create() {
return new EmptyReturnValue();
private static final class EmptyReturnValueDeserializer extends CustomNullDeserializer<EmptyReturnValue> {
@Override
public EmptyReturnValue create() {
return new EmptyReturnValue();
}
}

}

@Generated("by conjure-java")