package org.jooby; import static org.junit.Assert.assertEquals; import java.util.Set; import org.jooby.test.ServerFeature; import org.junit.Test; import com.google.inject.Key; import com.google.inject.TypeLiteral; import com.google.inject.multibindings.Multibinder; public class ParserOrderFeature extends ServerFeature { Key<Set<Parser>> KEY = Key.get(new TypeLiteral<Set<Parser>>() { }); { parser(new Parser() { @Override public Object parse(final TypeLiteral<?> type, final Context ctx) throws Throwable { assertEquals( "[Basic, Collection, Optional, Enum, Upload, byte[], p1, p2, p3, Date, LocalDate, Locale, valueOf(String), fromString(String), forName(String), init(String), bean]", ctx.toString()); return ctx.next(); } @Override public String toString() { return "p1"; } }); use((env, conf, binder) -> { Multibinder.newSetBinder(binder, Parser.class).addBinding().toInstance(new Parser() { @Override public Object parse(final TypeLiteral<?> type, final Context ctx) throws Throwable { return ctx.next(); } @Override public String toString() { return "p2"; } }); }); parser(new Parser() { @Override public Object parse(final TypeLiteral<?> type, final Context ctx) throws Throwable { return ctx.next(); } @Override public String toString() { return "p3"; } }); get("/parser/order", req -> req.require(KEY)); } @Test public void order() throws Exception { request() .get("/parser/order") .expect( "[Basic, Collection, Optional, Enum, Upload, byte[], p1, p2, p3, Date, LocalDate, Locale, valueOf(String), fromString(String), forName(String), init(String), bean]"); } }