Compare commits

...

37 Commits

Author SHA1 Message Date
eb88f0bfbc v3.0.2-jersey pom 2025-02-28 11:27:15 -05:00
079e04d386 Merge branch 'stable' into stable-jersey 2025-02-28 11:26:40 -05:00
d1a4cfdb89 Merge branch 'develop-jersey' into stable-jersey 2025-02-28 11:25:59 -05:00
2c15ce03a2 jersey v3.1.10 2025-02-28 11:25:34 -05:00
093936aabb Merge branch 'develop' into develop-jersey 2025-02-28 11:22:17 -05:00
63b48b8cbf Merge branch 'develop-jersey' into stable-jersey 2024-08-15 12:04:51 -04:00
3f34ddb59d v3.x; jersey v3.x 2024-08-15 11:51:22 -04:00
009bf7bb87 v2.0.10-jersey pom 2024-03-05 18:53:01 -05:00
b7c8e4479a Merge branch 'develop-jersey' into stable-jersey 2024-03-05 18:52:40 -05:00
255d64728e Merge branch 'develop' into develop-jersey 2024-03-05 18:47:23 -05:00
c61f2ca107 removing spring annotations to support multiple clients 2024-03-05 18:45:46 -05:00
1b2fbe5413 v2.0.9-jersey pom 2024-01-23 10:45:42 -05:00
80990f5335 Merge branch 'develop-jersey' into stable-jersey 2024-01-23 10:45:25 -05:00
f1852afe4e Merge branch 'develop' into develop-jersey 2024-01-23 10:43:58 -05:00
a8d2740329 v2.0.8-jersey pom 2023-06-29 10:56:57 -04:00
1f50bb8d3f Merge branch 'develop-jersey' into stable-jersey 2023-06-29 10:56:38 -04:00
d386f35258 Merge branch 'develop' into develop-jersey 2023-06-29 10:31:57 -04:00
7c98ce5545 v2.0.7-jersey pom 2023-06-12 17:19:39 -04:00
4c7e9da980 Merge branch 'develop-jersey' into stable-jersey 2023-06-12 17:19:21 -04:00
bb20a78224 Merge branch 'develop' into develop-jersey 2023-06-12 17:16:14 -04:00
518be99d4e v2.0.6-jersey pom 2023-06-12 16:14:51 -04:00
2dd7de15a3 Merge branch 'develop-jersey' into stable-jersey 2023-06-12 16:14:16 -04:00
053b7a36ff removing javax.annotation conflict 2023-06-12 16:08:32 -04:00
fa96a8cfb8 Merge branch 'develop' into develop-jersey 2023-06-12 16:07:35 -04:00
a4a1b3a9e6 v2.0.4-jersey 2023-05-30 18:02:43 -04:00
9e3c749f9b Merge branch 'develop-jersey' into stable-jersey 2023-05-30 18:02:14 -04:00
2cbb08e9cc Merge branch 'develop' into develop-jersey 2023-05-30 17:58:54 -04:00
6844044395 Merge branch 'develop' into develop-jersey 2023-05-30 17:54:44 -04:00
722a04fe16 v2.0.3-jersey 2023-05-30 12:45:35 -04:00
1e5fcf6ab8 Merge branch 'develop-jersey' into stable-jersey 2023-05-30 12:45:13 -04:00
efcfab1795 Merge branch 'develop' into develop-jersey 2023-05-30 12:44:04 -04:00
5c242d88f1 v2.0.2-jersey pom 2023-05-29 10:17:17 -04:00
e56152c47b Merge branch 'develop-jersey' into stable-jersey 2023-05-29 10:16:34 -04:00
eb843c3cb6 upgraded jersey version 2023-05-29 10:07:46 -04:00
56aca63307 Merge branch 'develop' into develop-jersey 2023-05-29 09:58:48 -04:00
22ab063d4e Merge branch 'develop-jersey' into stable-jersey 2022-10-02 17:58:08 -04:00
df402790b4 added Jersey impl 2022-10-02 17:50:48 -04:00
4 changed files with 257 additions and 5 deletions

View File

@@ -1,7 +1,7 @@
# Common ReST Client Library # Common ReST Client Library
This project provides a library for Spring and POJO-based REST client instantiation. This project provides a library for Spring and POJO-based REST client instantiation. It includes special classes for the Jersey JAXRS-based client frameworks.
## Usage ## Usage
@@ -15,7 +15,7 @@ First, you will need to include the library in your project.
<dependency> <dependency>
<groupId>com.inteligr8</groupId> <groupId>com.inteligr8</groupId>
<artifactId>common-rest-client</artifactId> <artifactId>common-rest-client</artifactId>
<version>...</version> <version>...-jersey</version>
</dependency> </dependency>
... ...
</dependencies> </dependencies>
@@ -23,4 +23,65 @@ First, you will need to include the library in your project.
</project> </project>
``` ```
See the `cxf` and `jersey` branches for examples and more documentation. ### Spring Framework
#### Single Client
If you will only be declaring a single client in your Spring context, this is easy. You will just need two things. First, inject the single client into any of your Spring beans. You may do inject it into more than one. An example is below:
```java
@Component
public class ... {
@Autowired
@Qualifier("client.jersey") // may be optional
private Client client;
}
```
Next, you need to configure that client. You can do that by providing a single implementation of the `ClientConfiguration` (or `ClientJerseyConfiguration`) interface.
```java
@Configuration
public class ... implements ClientJerseyConfiguration {
...
}
```
#### Multiple Clients
If you will or may have multiple clients in your Spring context, there is an extra step. You will still need to define a `ClientConfiguration` for each. On top of that, you will need to create specialized implementations of each client. That special implementation will reference the configuration directly. An example is below.
```java
@Component("my.client")
public class MyClient extends ClientJerseyImpl {
@Autowired
public MyClient(MyClientConfiguration config) {
super(config);
}
}
```
You can then inject your client(s) into your Spring beans. Like the example below:
```java
@Component
public class ... {
@Autowired
private MyClient client;
@PostConstruct
public void init() {
MyJaxRsApi api = this.client.getApi(MyJaxRsApi.class);
}
}
### POJO
You do not have to use the Spring framework to use these classes. You can instantiate them directly. But you wil still need to create a `ClientConfiguration` as mentioned above.
```java
MyClientConfiguration config = new MyClientConfiguration();
...
ClientJerseyImpl client = new ClientJerseyImpl(config);
MyJaxRsApi api = client.getApi(MyJaxRsApi.class);
```

59
pom.xml
View File

@@ -6,11 +6,11 @@
<groupId>com.inteligr8</groupId> <groupId>com.inteligr8</groupId>
<artifactId>common-rest-client</artifactId> <artifactId>common-rest-client</artifactId>
<version>3.0.2</version> <version>3.0.2-jersey</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>ReST API Client for Java</name> <name>ReST API Client for Java</name>
<description>A common library for building REST API clients</description> <description>A common library for building Jersey REST API clients</description>
<url>https://bitbucket.org/inteligr8/common-rest-client</url> <url>https://bitbucket.org/inteligr8/common-rest-client</url>
<licenses> <licenses>
@@ -46,6 +46,7 @@
<junit.version>5.12.0</junit.version> <junit.version>5.12.0</junit.version>
<spring.version>6.0.23</spring.version> <spring.version>6.0.23</spring.version>
<jackson.version>2.17.3</jackson.version> <jackson.version>2.17.3</jackson.version>
<jersey.version>3.1.10</jersey.version>
</properties> </properties>
<dependencies> <dependencies>
@@ -107,10 +108,64 @@
<version>4.5.14</version> <version>4.5.14</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<!-- Jersey libraries -->
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-proxy-client</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>${jersey.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey.version}</version>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.4.0</version>
<executions>
<execution>
<id>add-jaxrs-src</id>
<goals><goal>add-source</goal></goals>
<configuration>
<sources>
<source>src/main/jersey</source>
</sources>
</configuration>
</execution>
<execution>
<id>add-test-src</id>
<goals><goal>add-test-source</goal></goals>
<configuration>
<sources>
<source>src/test/jersey</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
<plugin> <plugin>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<version>3.4.0</version> <version>3.4.0</version>

View File

@@ -0,0 +1,35 @@
/*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.inteligr8.rs;
/**
* This interface defines additional configurations specific to the Jersey
* JAX-RS library and its nuances.
*
* @author brian@inteligr8.com
*/
public interface ClientJerseyConfiguration extends ClientConfiguration {
/**
* Jersey is automatically strict in its adherence to the ReST API
* specifications. It requires a body to PUT calls by default.
*
* @return true to require body in PUT calls; false to make it optional
*/
default boolean isPutBodyRequired() {
return true;
}
}

View File

@@ -0,0 +1,101 @@
/*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.inteligr8.rs;
import jakarta.annotation.PostConstruct;
import jakarta.ws.rs.client.ClientBuilder;
import jakarta.ws.rs.ext.RuntimeDelegate;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.proxy.WebResourceFactory;
import org.glassfish.jersey.internal.RuntimeDelegateImpl;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A class that provides pre-configured JAX-RS Client &amp; WebTarget objects
* for Jersey.
*
* @author brian@inteligr8.com
*/
public class ClientJerseyImpl extends Client {
private final Logger logger = LoggerFactory.getLogger(ClientJerseyImpl.class);
private ClientJerseyConfiguration config;
/**
* This constructor is for Spring or POJO use.
* @param config The client configuration.
*/
public ClientJerseyImpl(ClientJerseyConfiguration config) {
this.config = config;
}
/**
* This method registers the Jersey library as the default provider for the
* JAX-RS specification.
*/
@PostConstruct
public void register() {
if (RuntimeDelegate.getInstance() == null) {
this.logger.info("Setting JAX-RS runtime delegate to the Jersey library");
RuntimeDelegate.setInstance(new RuntimeDelegateImpl());
} else if (RuntimeDelegate.getInstance() instanceof RuntimeDelegateImpl) {
this.logger.info("JAX-RS runtime delegate already the Jersey library");
} else {
this.logger.warn("Setting JAX-RS runtime delegate to the Jersey library; was: " + RuntimeDelegate.getInstance().getClass().getName());
RuntimeDelegate.setInstance(new RuntimeDelegateImpl());
}
if (this.logger.isInfoEnabled())
this.logger.info("API Base URL: " + this.getConfig().getBaseUrl());
}
/**
* @param clientBuilder A client builder.
*/
@Override
public void buildClient(ClientBuilder clientBuilder) {
clientBuilder.register(MultiPartFeature.class);
if (!this.getConfig().isPutBodyRequired()) {
// allow PUT operations without body data
clientBuilder.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
}
}
/**
* @return The client configuration.
*/
public ClientJerseyConfiguration getConfig() {
return this.config;
}
/**
* This method retrieves a JAX-RS implementation of the specified API with
* the specified authorization.
*
* @param authFilter A dynamic authorization filter.
* @param apiClass A JAX-RS annotation API class.
* @return An instance of the API class.
*/
@Override
public <T> T getApi(AuthorizationFilter authFilter, Class<T> apiClass) {
return WebResourceFactory.newResource(apiClass, this.getTarget(authFilter));
}
}