File tree Expand file tree Collapse file tree
main/java/feign/optionals
test/java/feign/optionals Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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 >
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 2020 <module >ribbon</module >
2121 <module >sax</module >
2222 <module >slf4j</module >
23+ <module >java8</module >
2324 </modules >
2425
2526 <properties >
You can’t perform that action at this time.
0 commit comments