Skip to content

Commit d7f40f5

Browse files
arielseguraadriancole
authored andcommitted
Introduces feign-java8 (OpenFeign#548)
Introduces `feign-java8` with support for `java.util.Optional`
1 parent 56c105d commit d7f40f5

5 files changed

Lines changed: 120 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
### Version 9.5
2+
* Introduces `feign-java8` with support for `java.util.Optional`
23
* Adds `Feign.Builder.mapAndDecode()` to allow response preprocessing before decoding it.
34

45
### Version 9.4.1

java8/pom.xml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>parent</artifactId>
7+
<groupId>io.github.openfeign</groupId>
8+
<version>9.4.1-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>feign-java8</artifactId>
13+
<name>Feign Java 8</name>
14+
<description>Feign Java 8</description>
15+
16+
<properties>
17+
<!-- override default bytecode version for src/main from parent pom -->
18+
<main.java.version>1.8</main.java.version>
19+
<main.signature.artifact>java18</main.signature.artifact>
20+
<main.basedir>${project.basedir}/..</main.basedir>
21+
<maven.compiler.source>1.8</maven.compiler.source>
22+
<maven.compiler.target>1.8</maven.compiler.target>
23+
</properties>
24+
25+
<dependencies>
26+
<dependency>
27+
<groupId>${project.groupId}</groupId>
28+
<artifactId>feign-core</artifactId>
29+
</dependency>
30+
<dependency>
31+
<groupId>${project.groupId}</groupId>
32+
<artifactId>feign-gson</artifactId>
33+
<scope>test</scope>
34+
</dependency>
35+
<dependency>
36+
<groupId>com.squareup.okhttp3</groupId>
37+
<artifactId>mockwebserver</artifactId>
38+
<scope>test</scope>
39+
</dependency>
40+
</dependencies>
41+
42+
</project>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package feign.optionals;
2+
3+
import feign.Response;
4+
import feign.Util;
5+
import feign.codec.Decoder;
6+
7+
import java.io.IOException;
8+
import java.lang.reflect.ParameterizedType;
9+
import java.lang.reflect.Type;
10+
import java.util.Objects;
11+
import java.util.Optional;
12+
13+
public final class OptionalDecoder implements Decoder {
14+
final Decoder delegate;
15+
16+
public OptionalDecoder(Decoder delegate) {
17+
Objects.requireNonNull(delegate, "Decoder must not be null. ");
18+
this.delegate = delegate;
19+
}
20+
21+
@Override public Object decode(Response response, Type type) throws IOException {
22+
if(!isOptional(type)) {
23+
return delegate.decode(response, type);
24+
}
25+
26+
if(response.status() == 404) {
27+
return Optional.empty();
28+
}
29+
Type enclosedType = Util.resolveLastTypeParameter(type, Optional.class);
30+
return Optional.of(delegate.decode(response, enclosedType));
31+
}
32+
33+
static boolean isOptional(Type type) {
34+
if(!(type instanceof ParameterizedType)) {
35+
return false;
36+
}
37+
ParameterizedType parameterizedType = (ParameterizedType) type;
38+
return parameterizedType.getRawType().equals(Optional.class);
39+
}
40+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package feign.optionals;
2+
3+
import feign.Feign;
4+
import feign.RequestLine;
5+
import feign.codec.Decoder;
6+
import okhttp3.mockwebserver.MockResponse;
7+
import okhttp3.mockwebserver.MockWebServer;
8+
import org.junit.Test;
9+
10+
import java.io.IOException;
11+
import java.util.Optional;
12+
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
15+
public class OptionalDecoderTests {
16+
17+
interface OptionalInterface {
18+
@RequestLine("GET /")
19+
Optional<String> get();
20+
}
21+
22+
@Test
23+
public void simpleOptionalTest() throws IOException, InterruptedException {
24+
MockWebServer server = new MockWebServer();
25+
server.enqueue(new MockResponse().setResponseCode(404));
26+
server.enqueue(new MockResponse().setBody("foo"));
27+
28+
OptionalInterface api = Feign.builder()
29+
.decode404()
30+
.decoder(new OptionalDecoder(new Decoder.Default()))
31+
.target(OptionalInterface.class, server.url("/").toString());
32+
33+
assertThat(api.get().isPresent()).isFalse();
34+
assertThat(api.get().get()).isEqualTo("foo");
35+
}
36+
}

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<module>ribbon</module>
2121
<module>sax</module>
2222
<module>slf4j</module>
23+
<module>java8</module>
2324
</modules>
2425

2526
<properties>

0 commit comments

Comments
 (0)