Compare commits
91 Commits
develop
...
stable-jer
Author | SHA1 | Date | |
---|---|---|---|
2055df8f72 | |||
991130708b | |||
477905aa33 | |||
65eedab7e6 | |||
4d3af40911 | |||
e074296de7 | |||
3bcec23ddd | |||
eb88f0bfbc | |||
079e04d386 | |||
d1a4cfdb89 | |||
2c15ce03a2 | |||
093936aabb | |||
eb2bd96ced | |||
c2147e1461 | |||
63b48b8cbf | |||
eb7ac34f5e | |||
3f34ddb59d | |||
009bf7bb87 | |||
b7c8e4479a | |||
271016dcf9 | |||
00ec8c972d | |||
255d64728e | |||
c61f2ca107 | |||
1b2fbe5413 | |||
80990f5335 | |||
f1852afe4e | |||
d4cd2f248c | |||
ac6f82a7f4 | |||
a8d2740329 | |||
1f50bb8d3f | |||
0258cfcb9a | |||
6fc43b85f7 | |||
d386f35258 | |||
512f118354 | |||
7c98ce5545 | |||
4c7e9da980 | |||
21255bfb3d | |||
bb20a78224 | |||
518be99d4e | |||
2dd7de15a3 | |||
f10fd39e97 | |||
eaed628f00 | |||
053b7a36ff | |||
fa96a8cfb8 | |||
a4a1b3a9e6 | |||
9e3c749f9b | |||
cd278bcc81 | |||
b64c408029 | |||
2cbb08e9cc | |||
6844044395 | |||
722a04fe16 | |||
1e5fcf6ab8 | |||
ec6e7cc15d | |||
2451c634b7 | |||
efcfab1795 | |||
5c242d88f1 | |||
e56152c47b | |||
ed00346e71 | |||
c001576b65 | |||
eb843c3cb6 | |||
56aca63307 | |||
22ab063d4e | |||
6cb7afd9f1 | |||
5df5388bd2 | |||
df402790b4 | |||
5cda622082 | |||
e1191abaaa | |||
67ea4b72b3 | |||
a574154c20 | |||
b1b19d8cb0 | |||
160766e0ef | |||
e167ac43cc | |||
a28fc13161 | |||
52c7e3cf6d | |||
bd7413bb48 | |||
75c518801f | |||
b3bc04467b | |||
88c8657a34 | |||
28b2478a08 | |||
dc63abc272 | |||
dd5d0f504a | |||
34d03a91e5 | |||
2584b8d668 | |||
a756b05f6c | |||
853b4e66cf | |||
f2032df0f3 | |||
8d3f4559bd | |||
3f476bba5c | |||
6292dde23b | |||
659f71c72c | |||
52f77dddbb |
67
README.md
67
README.md
@ -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
59
pom.xml
@ -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-SNAPSHOT</version>
|
<version>3.0.3-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>
|
||||||
|
@ -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
|
||||||
|
* Jakarta 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
101
src/main/jersey/com/inteligr8/rs/ClientJerseyImpl.java
Normal file
101
src/main/jersey/com/inteligr8/rs/ClientJerseyImpl.java
Normal 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 & 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
|
||||||
|
* Jakarta RS specification.
|
||||||
|
*/
|
||||||
|
@PostConstruct
|
||||||
|
public void register() {
|
||||||
|
if (RuntimeDelegate.getInstance() == null) {
|
||||||
|
this.logger.info("Setting Jakarta RS runtime delegate to the Jersey library");
|
||||||
|
RuntimeDelegate.setInstance(new RuntimeDelegateImpl());
|
||||||
|
} else if (RuntimeDelegate.getInstance() instanceof RuntimeDelegateImpl) {
|
||||||
|
this.logger.info("Jakarta RS runtime delegate already the Jersey library");
|
||||||
|
} else {
|
||||||
|
this.logger.warn("Setting Jakarta 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 Jakarta RS implementation of the specified API
|
||||||
|
* with the specified authorization.
|
||||||
|
*
|
||||||
|
* @param authFilter A dynamic authorization filter.
|
||||||
|
* @param apiClass A Jakarta 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user