You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/12/01 12:20:15 UTC

[isis] branch spring6 updated (bc1e0613d3 -> 0ae277e4c0)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a change to branch spring6
in repository https://gitbox.apache.org/repos/asf/isis.git


    from bc1e0613d3 ISIS-3275: remove superfluous deps (left over from troubleshooting)
     add bb003fe6c1 ISIS-3275: re-implement OutboxClient on top of RestClient (1)
     add 8d65df4883 ISIS-3275: re-implement OutboxClient on top of RestClient (2)
     add 2777a195ff ISIS-3275: re-implement OutboxClient on top of RestClient (3)
     add b7076bfafa ISIS-3275: re-implement OutboxClient on top of RestClient (4)
     add 72f653d655 ISIS-3275: re-implement OutboxClient on top of RestClient (5)
     add a7e244f5ff ISIS-3275: re-implement OutboxClient on top of RestClient (6)
     new 0ae277e4c0 ISIS-3275: merge from master

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../causeway/applib/client/SuppressionType.java    |   8 +-
 bom/pom.xml                                        |  53 ++-----
 ...nthesizedMergedAnnotationInvocationHandler.java |  19 +--
 .../applib/restapi/OutboxRestApi.java              |   2 -
 extensions/core/executionoutbox/restclient/pom.xml | 143 +++----------------
 .../executionoutbox/restclient/api/Jsonable.java   |  27 ----
 .../restclient/api/OutboxClient.java               | 156 ++++++++-------------
 .../executionoutbox/restclient/api/_Jaxb.java      |  92 ------------
 .../restclient/api/delete/DeleteMessage.java       |  30 +---
 .../restclient/api/delete/IntValue.java            |   7 +-
 .../restclient/api/delete/StringValue.java         |   7 +-
 .../api/deleteMany/DeleteManyMessage.java          |  27 +---
 .../restclient/integtests/RestEndpointService.java |   3 +-
 .../secondary/fetch/CommandFetcher.java            |  20 +--
 .../testdomain/util/rest/RestEndpointService.java  |  29 ++--
 .../client/src/main/java/module-info.java          |   6 +-
 .../restfulobjects/client/ResponseDigest.java      |  66 +--------
 .../restfulobjects/client/ResponseDigester.java    | 127 +++++++++++++++++
 .../restfulobjects/client/RestfulClient.java       | 120 ++++++++--------
 .../restfulobjects/client/RestfulClientConfig.java |  43 +++++-
 .../client/RestfulClientMediaType.java             |  96 +++++++++++++
 21 files changed, 469 insertions(+), 612 deletions(-)
 delete mode 100644 extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/Jsonable.java
 delete mode 100644 extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/_Jaxb.java
 create mode 100644 viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/ResponseDigester.java
 create mode 100644 viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/RestfulClientMediaType.java


[isis] 01/01: ISIS-3275: merge from master

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch spring6
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 0ae277e4c04002caf33fc61c96ef6fe3d8095fbd
Merge: bc1e0613d3 a7e244f5ff
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Dec 1 13:20:08 2022 +0100

    ISIS-3275: merge from master

 .../causeway/applib/client/SuppressionType.java    |   8 +-
 bom/pom.xml                                        |  53 ++-----
 ...nthesizedMergedAnnotationInvocationHandler.java |  19 +--
 .../applib/restapi/OutboxRestApi.java              |   2 -
 extensions/core/executionoutbox/restclient/pom.xml | 143 +++----------------
 .../executionoutbox/restclient/api/Jsonable.java   |  27 ----
 .../restclient/api/OutboxClient.java               | 156 ++++++++-------------
 .../executionoutbox/restclient/api/_Jaxb.java      |  92 ------------
 .../restclient/api/delete/DeleteMessage.java       |  30 +---
 .../restclient/api/delete/IntValue.java            |   7 +-
 .../restclient/api/delete/StringValue.java         |   7 +-
 .../api/deleteMany/DeleteManyMessage.java          |  27 +---
 .../restclient/integtests/RestEndpointService.java |   3 +-
 .../secondary/fetch/CommandFetcher.java            |  20 +--
 .../testdomain/util/rest/RestEndpointService.java  |  29 ++--
 .../client/src/main/java/module-info.java          |   6 +-
 .../restfulobjects/client/ResponseDigest.java      |  66 +--------
 .../restfulobjects/client/ResponseDigester.java    | 127 +++++++++++++++++
 .../restfulobjects/client/RestfulClient.java       | 120 ++++++++--------
 .../restfulobjects/client/RestfulClientConfig.java |  43 +++++-
 .../client/RestfulClientMediaType.java             |  96 +++++++++++++
 21 files changed, 469 insertions(+), 612 deletions(-)

diff --cc bom/pom.xml
index 63f3e5dab4,74d46d9126..1e8d4b8b12
--- a/bom/pom.xml
+++ b/bom/pom.xml
@@@ -241,53 -233,31 +241,35 @@@ It is therefore a copy of org.apache:ap
          </dependencies>
      </dependencyManagement>
      <repositories>
 -        <!-- breaks dependabot run: timeout due to repo not accessible
 -        <repository>
 -            <id>apache.snapshots</id>
 -            <name>Apache Snapshot Repository</name>
 -            <url>https://repository.apache.org/snapshots</url>
 -            <releases>
 -                <enabled>false</enabled>
 -            </releases>
 -        </repository>
 -        -->
+ 		<repository>
+ 			<id>central</id>
+ 			<name>Central Repository</name>
+ 			<url>https://repo.maven.apache.org/maven2</url>
+ 			<snapshots>
+ 				<enabled>false</enabled>
+ 			</snapshots>
+ 		</repository>
 +        <repository>
 +			<!-- temporary till release of cxf 4.0.0, shiro 2.0.0 and wicket 10.0.0 -->
 +            <id>apache.snapshots</id>
-             <name>Shiro Snapshot Repository</name>
 +            <url>https://repository.apache.org/content/groups/snapshots/</url>
 +            <snapshots><enabled>true</enabled></snapshots>
 +        </repository>
  		<repository>
 -			<id>Apache Repository</id>
 -			<url>https://repository.apache.org/</url>
 +			<!-- used for wicket 10.0.0-M1-SNAPSHOT fork at 
 +				https://jitpack.io/#apache-causeway-committers/wicket
 +				temporary till release of wicket 10.0.0 -->
 +		    <id>jitpack.io</id>
 +		    <url>https://jitpack.io</url>
 +		</repository>
 +        <repository>
 +			<!-- temporary till release of wicket-stuff 10.0.0 -->
- 			<id>wicketstuff-core-snapshots</id>
++			<id>sonatype-snapshots</id>
 +			<url>https://oss.sonatype.org/content/repositories/snapshots</url>
  			<snapshots>
 -				<enabled>false</enabled>
 -			</snapshots>
 +				<enabled>true</enabled>
 +			</snapshots>		
  		</repository>
-         <!-- breaks dependabot run: timeout due to repo not accessible
-         <repository>
-             <id>apache.snapshots</id>
-             <name>Apache Snapshot Repository</name>
-             <url>https://repository.apache.org/snapshots</url>
-             <releases>
-                 <enabled>false</enabled>
-             </releases>
-         </repository>
-         -->
- 		<repository>
- 			<id>central</id>
- 			<name>Central Repository</name>
- 			<url>https://repo.maven.apache.org/maven2</url>
- 			<snapshots>
- 				<enabled>false</enabled>
- 			</snapshots>
- 		</repository>
- 		<repository>
- 			<id>Apache Repository</id>
- 			<url>https://repository.apache.org/</url>
- 			<snapshots>
- 				<enabled>false</enabled>
- 			</snapshots>
- 		</repository>
  		<repository>
  			<!-- required for RestEasy -->
  			<id>JBoss Public Release</id>
@@@ -296,25 -266,25 +278,8 @@@
  				<enabled>false</enabled>
  			</snapshots>
  		</repository>
--		<repository>
--			<id>sonatype-snapshots</id>
--			<url>https://oss.sonatype.org/content/repositories/snapshots</url>
--			<snapshots>
--				<enabled>true</enabled>
--			</snapshots>
--		</repository>
      </repositories>
      <pluginRepositories>
--        <!-- breaks dependabot run: timeout due to repo not accessible
--        <pluginRepository>
--            <id>apache.snapshots</id>
--            <name>Apache Snapshot Repository</name>
--            <url>https://repository.apache.org/snapshots</url>
--            <releases>
--                <enabled>false</enabled>
--            </releases>
--        </pluginRepository>
--        -->
  		<pluginRepository>
  			<id>DataNucleus_2</id>
  			<url>https://www.datanucleus.org/downloads/maven2/</url>
diff --cc commons/src/main/java/org/apache/causeway/commons/internal/reflection/_Annotations_SynthesizedMergedAnnotationInvocationHandler.java
index 5c5108abd2,6b4de058b0..5f0c25b976
--- a/commons/src/main/java/org/apache/causeway/commons/internal/reflection/_Annotations_SynthesizedMergedAnnotationInvocationHandler.java
+++ b/commons/src/main/java/org/apache/causeway/commons/internal/reflection/_Annotations_SynthesizedMergedAnnotationInvocationHandler.java
@@@ -236,23 -236,21 +236,24 @@@ implements InvocationHandler 
                          additional.get(), null, annotationType);
  
          val classLoader = annotationType.getClassLoader();
-         //TODO[ISIS-3275]
 -        val interfaces = isVisible(classLoader, SynthesizedAnnotation.class)
 -                ? new Class<?>[] {annotationType, SynthesizedAnnotation.class}
 -                : new Class<?>[] {annotationType};
++        /* removal of SynthesizedAnnotation in Spring 6
++         * https://github.com/spring-projects/spring-framework/commit/69f23095b810615862336d35d878dda63f7b4fca */
 +        val interfaces = //isVisible(classLoader, SynthesizedAnnotation.class)
 +                //? new Class<?>[] {annotationType, SynthesizedAnnotation.class}
 +                //:
 +                    new Class<?>[] {annotationType};
          val proxy = (A) Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
          return Optional.of(proxy);
      }
  
--    private static boolean isVisible(final ClassLoader classLoader, final Class<?> interfaceClass) {
--        try {
--            return Class.forName(interfaceClass.getName(), false, classLoader) == interfaceClass;
--        }
--        catch (ClassNotFoundException ex) {
--            return false;
--        }
--    }
++//    private static boolean isVisible(final ClassLoader classLoader, final Class<?> interfaceClass) {
++//        try {
++//            return Class.forName(interfaceClass.getName(), false, classLoader) == interfaceClass;
++//        }
++//        catch (ClassNotFoundException ex) {
++//            return false;
++//        }
++//    }
  
      /**
       * If annotations from a getter method are competing with annotations from its corresponding field,
diff --cc extensions/core/executionoutbox/restclient/pom.xml
index b98eb9e435,5a9c7e2dae..b09bfb8989
--- a/extensions/core/executionoutbox/restclient/pom.xml
+++ b/extensions/core/executionoutbox/restclient/pom.xml
@@@ -66,32 -54,24 +54,24 @@@
          </dependency>
  
          <dependency>
-             <groupId>jakarta.ws.rs</groupId>
-             <artifactId>jakarta.ws.rs-api</artifactId>
+             <groupId>org.apache.causeway.core</groupId>
+             <artifactId>causeway-schema</artifactId>
          </dependency>
+         
+ 		<dependency>
+ 			<groupId>org.apache.causeway.viewer</groupId>
+ 			<artifactId>causeway-viewer-restfulobjects-client</artifactId>
 -			<version>2.0.0-SNAPSHOT</version>
++			<version>3.0.0-SNAPSHOT</version>
+ 		</dependency>
  
-         <dependency>
-             <groupId>org.apache.cxf</groupId>
-             <artifactId>cxf-rt-rs-client</artifactId>
-         </dependency>
- 
-         <!-- TESTING -->
- 
-         <dependency>
-             <groupId>org.apache.causeway.testing</groupId>
-             <artifactId>causeway-testing-unittestsupport-applib</artifactId>
-             <scope>test</scope>
-         </dependency>
-         <dependency>
-             <groupId>org.apache.causeway.security</groupId>
-             <artifactId>causeway-security-bypass</artifactId>
-             <scope>test</scope>
-         </dependency>
+ 		<!-- TESTING -->
+ 		
          <dependency>
              <groupId>org.apache.causeway.core</groupId>
-             <artifactId>causeway-core-runtimeservices</artifactId>
+             <artifactId>causeway-core-internaltestsupport</artifactId>
              <scope>test</scope>
          </dependency>
+ 
          <dependency>
              <groupId>org.apache.causeway.testing</groupId>
              <artifactId>causeway-testing-fixtures-applib</artifactId>
diff --cc extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/OutboxClient.java
index 5263c0a934,27bc33f225..dfec7a0438
--- a/extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/OutboxClient.java
+++ b/extensions/core/executionoutbox/restclient/src/main/java/org/apache/causeway/extensions/executionoutbox/restclient/api/OutboxClient.java
@@@ -21,16 -21,14 +21,14 @@@
  package org.apache.causeway.extensions.executionoutbox.restclient.api;
  
  import java.util.Collections;
- import java.util.HashMap;
  import java.util.List;
- import java.util.concurrent.TimeUnit;
  
- import jakarta.ws.rs.client.Client;
- import jakarta.ws.rs.client.ClientBuilder;
 -import javax.ws.rs.client.Entity;
 -import javax.ws.rs.core.MediaType;
 +import jakarta.ws.rs.client.Entity;
 +import jakarta.ws.rs.core.MediaType;
- import jakarta.ws.rs.core.UriBuilder;
  
+ import org.apache.causeway.applib.util.schema.InteractionsDtoUtils;
+ import org.apache.causeway.commons.functional.Try;
+ import org.apache.causeway.commons.internal.resources._Json;
  import org.apache.causeway.extensions.executionoutbox.restclient.api.delete.DeleteMessage;
  import org.apache.causeway.extensions.executionoutbox.restclient.api.deleteMany.DeleteManyMessage;
  import org.apache.causeway.schema.common.v2.InteractionType;
diff --cc regressiontests/stable/src/main/java/org/apache/causeway/testdomain/util/rest/RestEndpointService.java
index 261ac24df0,f8d2ca8ae0..b996cc7a43
--- a/regressiontests/stable/src/main/java/org/apache/causeway/testdomain/util/rest/RestEndpointService.java
+++ b/regressiontests/stable/src/main/java/org/apache/causeway/testdomain/util/rest/RestEndpointService.java
@@@ -36,12 -41,9 +36,13 @@@ import org.apache.causeway.testdomain.l
  import org.apache.causeway.testdomain.util.dto.BookDto;
  import org.apache.causeway.viewer.restfulobjects.client.RestfulClient;
  import org.apache.causeway.viewer.restfulobjects.client.RestfulClientConfig;
+ import org.apache.causeway.viewer.restfulobjects.client.RestfulClientMediaType;
  import org.apache.causeway.viewer.restfulobjects.client.log.ClientConversationFilter;
  
 +import jakarta.inject.Inject;
 +import jakarta.ws.rs.client.Invocation;
 +import jakarta.ws.rs.core.GenericType;
 +import jakarta.xml.bind.JAXBException;
  import lombok.NonNull;
  import lombok.RequiredArgsConstructor;
  import lombok.val;
diff --cc viewers/restfulobjects/client/src/main/java/module-info.java
index bc1bf17cd8,18615e6f43..1fabe8b8e3
--- a/viewers/restfulobjects/client/src/main/java/module-info.java
+++ b/viewers/restfulobjects/client/src/main/java/module-info.java
@@@ -23,13 -23,13 +23,13 @@@ module org.apache.causeway.viewer.restf
  
      requires com.fasterxml.jackson.core;
      requires com.fasterxml.jackson.databind;
 -    requires java.annotation;
 -    requires java.ws.rs;
 -    requires java.xml.bind;
 +    requires jakarta.annotation;
 +    requires jakarta.ws.rs;
 +    requires jakarta.xml.bind;
      requires lombok;
-     requires org.apache.causeway.applib;
-     requires org.apache.causeway.commons;
-     requires org.apache.causeway.viewer.restfulobjects.applib;
+     requires transitive org.apache.causeway.applib;
+     requires transitive org.apache.causeway.commons;
+     requires transitive org.apache.causeway.viewer.restfulobjects.applib;
      requires org.apache.logging.log4j;
      requires spring.core;
  }
diff --cc viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/ResponseDigest.java
index dbb3ded646,5c4ef3c978..70907b2cf7
--- a/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/ResponseDigest.java
+++ b/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/ResponseDigest.java
@@@ -26,22 -24,15 +24,15 @@@ import java.util.List
  import java.util.NoSuchElementException;
  import java.util.Optional;
  
 -import javax.ws.rs.core.GenericType;
 -import javax.ws.rs.core.Response;
 -import javax.ws.rs.core.Response.Status.Family;
 +import jakarta.ws.rs.core.GenericType;
 +import jakarta.ws.rs.core.Response;
 +import jakarta.ws.rs.core.Response.Status.Family;
  
- import com.fasterxml.jackson.core.JsonParseException;
- import com.fasterxml.jackson.databind.JsonMappingException;
- import com.fasterxml.jackson.databind.ObjectMapper;
- 
  import org.springframework.lang.Nullable;
  
- import org.apache.causeway.applib.client.RepresentationTypeSimplifiedV2;
  import org.apache.causeway.commons.collections.Can;
- import org.apache.causeway.commons.internal.base._Casts;
  import org.apache.causeway.commons.internal.base._Strings;
  import org.apache.causeway.commons.internal.exceptions._Exceptions;
- import org.apache.causeway.viewer.restfulobjects.applib.dtos.ScalarValueDtoV2;
  
  import lombok.NonNull;
  import lombok.val;
diff --cc viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/ResponseDigester.java
index 0000000000,ed4c52651d..ea280366f6
mode 000000,100644..100644
--- a/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/ResponseDigester.java
+++ b/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/ResponseDigester.java
@@@ -1,0 -1,127 +1,127 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
+ package org.apache.causeway.viewer.restfulobjects.client;
+ 
+ import java.io.IOException;
+ import java.util.ArrayList;
+ import java.util.List;
+ import java.util.Optional;
+ 
 -import javax.ws.rs.core.GenericType;
 -import javax.ws.rs.core.Response;
++import jakarta.ws.rs.core.GenericType;
++import jakarta.ws.rs.core.Response;
+ 
+ import com.fasterxml.jackson.core.JsonParseException;
+ import com.fasterxml.jackson.databind.JsonMappingException;
+ import com.fasterxml.jackson.databind.ObjectMapper;
+ 
+ import org.springframework.lang.Nullable;
+ 
+ import org.apache.causeway.applib.client.RepresentationTypeSimplifiedV2;
+ import org.apache.causeway.commons.internal.base._Casts;
+ import org.apache.causeway.commons.internal.base._Strings;
+ import org.apache.causeway.commons.internal.exceptions._Exceptions;
+ import org.apache.causeway.viewer.restfulobjects.applib.dtos.ScalarValueDtoV2;
+ 
+ import lombok.RequiredArgsConstructor;
+ import lombok.SneakyThrows;
+ import lombok.val;
+ 
+ interface ResponseDigester {
+ 
+     <T> T readSingle(Class<T> entityType, Response response);
+     <T> List<T> readList(Class<T> entityType, GenericType<List<T>> genericType, Response response);
+ 
+     // -- FACTORIES
+ 
+     static Optional<ResponseDigester> forContentTypeHeaderString(final @Nullable String contentTypeHeaderString) {
+         if(_Strings.isEmpty(contentTypeHeaderString)) {
+             return Optional.empty();
+         }
+         if(contentTypeHeaderString.startsWith("application/xml;profile=\"urn:org.restfulobjects:repr-types/action-result\"")
+                 && contentTypeHeaderString.contains("x-ro-domain-type")) {
+             return Optional.of(new ResponseDigesterXmlStandard());
+         }
+         return RepresentationTypeSimplifiedV2.parseContentTypeHeaderString(contentTypeHeaderString)
+               .map(ResponseDigesterJsonSimple::new);
+     }
+ 
+     // -- IMPLEMENTATIONS
+ 
+     @RequiredArgsConstructor
+     static class ResponseDigesterXmlStandard implements ResponseDigester {
+ 
+         @Override
+         public <T> T readSingle(final Class<T> entityType, final Response response) {
+             return response.readEntity(entityType);
+         }
+ 
+         @Override
+         public <T> List<T> readList(final Class<T> entityType, final GenericType<List<T>> genericType, final Response response) {
+             throw _Exceptions.notImplemented();
+         }
+     }
+ 
+     @RequiredArgsConstructor
+     static class ResponseDigesterJsonSimple implements ResponseDigester {
+ 
+         private final RepresentationTypeSimplifiedV2 reprType;
+ 
+         @SneakyThrows
+         @Override
+         public <T> T readSingle(final Class<T> entityType, final Response response) {
+             if(reprType.isValue()
+                     || reprType.isValues()) {
+                 val mapper = new ObjectMapper();
+                 val jsonInput = response.readEntity(String.class);
+                 val scalarValueDto = mapper.readValue(jsonInput, ScalarValueDtoV2.class);
+                 return extractValue(scalarValueDto);
+             }
+             return response.<T>readEntity(entityType);
+         }
+ 
+         @SneakyThrows
+         @Override
+         public <T> List<T> readList(final Class<T> entityType, final GenericType<List<T>> genericType, final Response response) {
+             if(reprType.isValues()
+                     || reprType.isValue()) {
+                 val mapper = new ObjectMapper();
+                 val jsonInput = response.readEntity(String.class);
+                 final List<ScalarValueDtoV2> scalarValueDtoList =
+                         mapper.readValue(
+                                 jsonInput,
+                                 mapper.getTypeFactory().constructCollectionType(List.class, ScalarValueDtoV2.class));
+ 
+                 final List<T> resultList = new ArrayList<>(scalarValueDtoList.size());
+                 for(val valueBody : scalarValueDtoList) {
+                     // explicit loop, for simpler exception propagation
+                     resultList.add(extractValue(valueBody));
+                 }
+                 return resultList;
+ 
+             }
+             return response.readEntity(genericType);
+         }
+ 
+         private <T> T extractValue(final ScalarValueDtoV2 scalarValueDto)
+                 throws JsonParseException, JsonMappingException, IOException {
+             return _Casts.uncheckedCast(scalarValueDto.getValue());
+         }
+     }
+ 
+ }
diff --cc viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/RestfulClient.java
index a23ad76ec2,a65ba69516..9988d8c7b0
--- a/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/RestfulClient.java
+++ b/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/RestfulClient.java
@@@ -18,18 -18,18 +18,18 @@@
   */
  package org.apache.causeway.viewer.restfulobjects.client;
  
- import java.util.EnumSet;
+ import java.net.URI;
  import java.util.List;
  import java.util.Objects;
- import java.util.stream.Collectors;
+ import java.util.function.UnaryOperator;
  
 -import javax.ws.rs.client.Client;
 -import javax.ws.rs.client.ClientBuilder;
 -import javax.ws.rs.client.Invocation.Builder;
 -import javax.ws.rs.core.GenericType;
 -import javax.ws.rs.core.Response;
 -import javax.ws.rs.core.UriBuilder;
 +import jakarta.ws.rs.client.Client;
 +import jakarta.ws.rs.client.ClientBuilder;
 +import jakarta.ws.rs.client.Invocation.Builder;
 +import jakarta.ws.rs.core.GenericType;
 +import jakarta.ws.rs.core.Response;
++import jakarta.ws.rs.core.UriBuilder;
  
- import org.apache.causeway.applib.client.SuppressionType;
  import org.apache.causeway.commons.collections.Can;
  import org.apache.causeway.commons.functional.Try;
  import org.apache.causeway.commons.internal.base._Strings;
diff --cc viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/RestfulClientConfig.java
index 723c2a1d5f,3d430d8ca3..c4caa327d9
--- a/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/RestfulClientConfig.java
+++ b/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/RestfulClientConfig.java
@@@ -20,12 -20,15 +20,15 @@@ package org.apache.causeway.viewer.rest
  
  import java.util.ArrayList;
  import java.util.List;
+ import java.util.concurrent.TimeUnit;
+ import java.util.concurrent.TimeoutException;
  
 -import javax.ws.rs.ProcessingException;
 -import javax.xml.bind.annotation.XmlAccessType;
 -import javax.xml.bind.annotation.XmlAccessorType;
 -import javax.xml.bind.annotation.XmlElement;
 -import javax.xml.bind.annotation.XmlRootElement;
 -import javax.xml.bind.annotation.XmlTransient;
++import jakarta.ws.rs.ProcessingException;
 +import jakarta.xml.bind.annotation.XmlAccessType;
 +import jakarta.xml.bind.annotation.XmlAccessorType;
 +import jakarta.xml.bind.annotation.XmlElement;
 +import jakarta.xml.bind.annotation.XmlRootElement;
 +import jakarta.xml.bind.annotation.XmlTransient;
  
  import org.apache.causeway.viewer.restfulobjects.client.log.ClientConversationFilter;
  
diff --cc viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/RestfulClientMediaType.java
index 0000000000,7ab02a68ba..086e26e805
mode 000000,100644..100644
--- a/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/RestfulClientMediaType.java
+++ b/viewers/restfulobjects/client/src/main/java/org/apache/causeway/viewer/restfulobjects/client/RestfulClientMediaType.java
@@@ -1,0 -1,96 +1,96 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
+ package org.apache.causeway.viewer.restfulobjects.client;
+ 
+ import java.util.EnumSet;
+ import java.util.Map;
+ import java.util.Optional;
+ import java.util.stream.Collectors;
+ 
 -import javax.ws.rs.core.MediaType;
++import jakarta.ws.rs.core.MediaType;
+ 
+ import org.springframework.lang.Nullable;
+ 
+ import org.apache.causeway.applib.client.SuppressionType;
+ import org.apache.causeway.commons.internal.base._NullSafe;
+ import org.apache.causeway.commons.internal.base._Strings;
+ import org.apache.causeway.commons.internal.collections._Maps;
+ 
+ import lombok.RequiredArgsConstructor;
+ import lombok.val;
+ 
+ @RequiredArgsConstructor
+ public enum RestfulClientMediaType {
+     RO_XML("application", "xml", "org.restfulobjects:repr-types/action-result"),
+     SIMPLE_JSON("application", "json", "org.apache.causeway/v2");
+     ;
+ 
+     private final String type;
+     private final String subType;
+     private final String urn;
+ 
+     public final MediaType mediaTypeFor() {
+         return mediaTypeFor(null, EnumSet.noneOf(SuppressionType.class));
+     }
+ 
+     public final MediaType mediaTypeFor(
+             final @Nullable Class<?> dtoClass) {
+         return mediaTypeFor(dtoClass, EnumSet.noneOf(SuppressionType.class));
+     }
+ 
+     public final MediaType mediaTypeFor(
+             final @Nullable EnumSet<SuppressionType> suppressionTypes) {
+         return new MediaType(type, subType, headerMap(urn, null, suppressionTypes));
+     }
+ 
+     public final MediaType mediaTypeFor(
+             final @Nullable Class<?> dtoClass,
+             final @Nullable EnumSet<SuppressionType> suppressionTypes) {
+         return new MediaType(type, subType, headerMap(urn, dtoClass, suppressionTypes));
+     }
+ 
+     // -- HELPER
+ 
+     private static Map<String, String> headerMap(
+             final String urn,
+             final Class<?> dtoClass,
+             final EnumSet<SuppressionType> suppressionTypes) {
+         val headerMap = _Maps.<String, String>newHashMap();
+ 
+         headerMap.put("profile", "urn:" + urn);
+ 
+         toSuppressionLiteral(suppressionTypes)
+         .ifPresent(suppress->headerMap.put("suppress", suppress));
+ 
+         Optional.ofNullable(dtoClass)
+         .map(Class::getName)
+         .ifPresent(typeLiteral->headerMap.put("x-ro-domain-type", typeLiteral));
+ 
+         return headerMap;
+     }
+ 
+     private static Optional<String> toSuppressionLiteral(final EnumSet<SuppressionType> suppressionTypes) {
+         final String suppressionSetLiteral = _NullSafe.stream(suppressionTypes)
+                 .map(SuppressionType::name)
+                 .collect(Collectors.joining(","));
+         return _Strings.nonEmpty(suppressionSetLiteral);
+     }
+ 
+ }
+