Skip to content

Commit e331eed

Browse files
committed
MVC: favor local attribute over locals fix jooby-project#1121
1 parent 3c3b055 commit e331eed

File tree

3 files changed

+63
-23
lines changed

3 files changed

+63
-23
lines changed

jooby/src/main/java/org/jooby/internal/mvc/RequestParam.java

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -203,27 +203,33 @@
203203
*/
204204
package org.jooby.internal.mvc;
205205

206+
import com.google.common.base.Strings;
207+
import com.google.common.collect.ImmutableMap;
208+
import com.google.common.collect.ImmutableMap.Builder;
209+
import com.google.inject.TypeLiteral;
210+
import com.google.inject.util.Types;
211+
import org.jooby.Cookie;
212+
import org.jooby.Err;
213+
import org.jooby.Mutant;
214+
import org.jooby.Request;
215+
import org.jooby.Response;
216+
import org.jooby.Route;
217+
import org.jooby.Session;
218+
import org.jooby.Status;
219+
import org.jooby.Upload;
220+
import org.jooby.mvc.Body;
221+
import org.jooby.mvc.Flash;
222+
import org.jooby.mvc.Header;
223+
import org.jooby.mvc.Local;
224+
225+
import javax.inject.Named;
206226
import java.lang.reflect.AnnotatedElement;
207227
import java.lang.reflect.Parameter;
208228
import java.lang.reflect.Type;
209229
import java.util.List;
210230
import java.util.Map;
211231
import java.util.Optional;
212232

213-
import javax.inject.Named;
214-
215-
import org.jooby.*;
216-
import org.jooby.mvc.Body;
217-
import org.jooby.mvc.Flash;
218-
import org.jooby.mvc.Header;
219-
import org.jooby.mvc.Local;
220-
221-
import com.google.common.base.Strings;
222-
import com.google.common.collect.ImmutableMap;
223-
import com.google.common.collect.ImmutableMap.Builder;
224-
import com.google.inject.TypeLiteral;
225-
import com.google.inject.util.Types;
226-
227233
@SuppressWarnings({"rawtypes", "unchecked" })
228234
public class RequestParam {
229235

@@ -302,18 +308,17 @@ private interface GetValue {
302308
* Local
303309
*/
304310
builder.put(localType, (req, rsp, chain, param) -> {
305-
if (param.type.getRawType() == Map.class) {
306-
return req.attributes();
307-
}
308311
Optional local = req.ifGet(param.name);
309312
if (param.optional) {
310313
return local;
311314
}
312315
if(local.isPresent()) {
313316
return local.get();
314-
} else {
315-
throw new Err(Status.SERVER_ERROR, "Could not find required local '" + param.name + "', which was required on " + req.path());
316317
}
318+
if (param.type.getRawType() == Map.class) {
319+
return req.attributes();
320+
}
321+
throw new Err(Status.SERVER_ERROR, "Could not find required local '" + param.name + "', which was required on " + req.path());
317322
});
318323

319324
/**
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.jooby.issues;
2+
3+
import com.google.common.collect.ImmutableMap;
4+
import org.jooby.mvc.GET;
5+
import org.jooby.mvc.Local;
6+
import org.jooby.mvc.Path;
7+
import org.jooby.test.ServerFeature;
8+
import org.junit.Test;
9+
10+
import java.util.Map;
11+
12+
public class Issue1121 extends ServerFeature {
13+
14+
@Path("/1121")
15+
public static class MVC {
16+
@GET
17+
public String locals(@Local Map<String, Object> something) {
18+
return something.toString();
19+
}
20+
}
21+
22+
{
23+
use("*", (req, rsp) -> {
24+
req.set("something", ImmutableMap.of("foo", "bar"));
25+
});
26+
27+
use(MVC.class);
28+
}
29+
30+
@Test
31+
public void localShouldFavorExistingMap() throws Exception {
32+
request().get("/1121")
33+
.expect("{foo=bar}");
34+
}
35+
}

modules/coverage-report/src/test/java/org/jooby/issues/Issue278c.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package org.jooby.issues;
22

3-
import java.util.Map;
4-
53
import org.jooby.mvc.GET;
64
import org.jooby.mvc.Local;
75
import org.jooby.mvc.Path;
86
import org.jooby.test.ServerFeature;
97
import org.junit.Test;
108

9+
import java.util.Map;
10+
1111
public class Issue278c extends ServerFeature {
1212

1313
@Path("/issue278")
1414
public static class Resource {
1515

1616
@GET
17-
public Object local(@Local final Map<String, Object> local) {
18-
return local;
17+
public Object local(@Local final Map<String, Object> locals) {
18+
return locals;
1919
}
2020
}
2121

0 commit comments

Comments
 (0)