This is an automated email from the ASF dual-hosted git repository. ahuber pushed a commit to branch v3 in repository https://gitbox.apache.org/repos/asf/causeway.git
commit 3b88feba1c214e91a5c0c479e17f0822092b3d3a Merge: 0550d6bcde 13b5debd17 Author: Andi Huber <[email protected]> AuthorDate: Fri Apr 12 12:22:00 2024 +0200 Merge remote-tracking branch 'origin/master' into v3 .../commons/internal/reflection/_Generics.java | 54 ++++++++++++++++- .../org/apache/causeway/commons/io/JsonUtils.java | 67 +++++++++++++++++++++- 2 files changed, 117 insertions(+), 4 deletions(-) diff --cc commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java index dd07eb9ec2,fa96958803..3477c3e6b8 --- a/commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java +++ b/commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java @@@ -24,7 -24,10 +24,10 @@@ import java.util.List import java.util.Optional; import java.util.function.UnaryOperator; -import javax.xml.bind.annotation.adapters.XmlAdapter; ++import jakarta.xml.bind.annotation.adapters.XmlAdapter; + import com.fasterxml.jackson.annotation.JsonInclude.Include; + import com.fasterxml.jackson.core.JacksonException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.BeanProperty; @@@ -46,7 -50,8 +50,9 @@@ import org.springframework.lang.Nullabl import org.apache.causeway.commons.collections.Can; import org.apache.causeway.commons.functional.Try; import org.apache.causeway.commons.internal.base._Casts; +import org.apache.causeway.commons.internal.context._Context; + import org.apache.causeway.commons.internal.exceptions._Exceptions; + import org.apache.causeway.commons.internal.reflection._Generics; import lombok.NonNull; import lombok.SneakyThrows; @@@ -60,25 -64,29 +66,44 @@@ import lombok.extern.log4j.Log4j2 * @since 2.0 {@index} */ @UtilityClass +@Log4j2 public class JsonUtils { + /** + * Consumers of the framework may choose to use a different provider. + */ + public Optional<Class<?>> getPlatformDefaultJsonProviderForJaxb() { + return Try.call(()->_Context.loadClass("org.eclipse.persistence.jaxb.rs.MOXyJsonProvider")) + .ifFailure(cause-> + log.warn("This implementation of RestfulClient does require the class 'MOXyJsonProvider'" + + " on the class-path." + + " Are you missing a maven dependency?") + ) + .getValue() + .map(x->x); + } + @FunctionalInterface - public interface JacksonCustomizer extends UnaryOperator<ObjectMapper> {} + public interface JacksonCustomizer extends UnaryOperator<ObjectMapper> { + public static <T> JacksonCustomizer wrapXmlAdapter(final XmlAdapter<String, T> xmlAdapter) { + @SuppressWarnings("unchecked") + var type = (Class<T>) _Generics.streamGenericTypeArgumentsOfType(xmlAdapter.getClass(), XmlAdapter.class) + .skip(1) + .findFirst() + .orElseThrow(()->_Exceptions.unsupportedOperation( + "Failed to autodetect second generic type argument of class %s. " + + "Use variant JacksonCustomizer.wrapXmlAdapter(type, xmlAdapter) " + + "to provide the type explicitely.", + xmlAdapter.getClass().getName())); + return wrapXmlAdapter(type, xmlAdapter); + } + public static <T> JacksonCustomizer wrapXmlAdapter(final Class<T> type, final XmlAdapter<String, T> xmlAdapter) { + return mapper-> + mapper.registerModule(new SimpleModule() + .addSerializer(new XSerializer<T>(type, xmlAdapter)) + .addDeserializer(type, new XDeserializer<T>(type, xmlAdapter))); + } + } // -- READING
