Skip to content
This repository was archived by the owner on Dec 19, 2023. It is now read-only.

Commit cc26eef

Browse files
jmisurfbenz
andauthored
Fix mixing modelattribute with other annotations (#443)
Co-authored-by: Florian Benz <[email protected]>
1 parent ab14170 commit cc26eef

File tree

8 files changed

+169
-283
lines changed

8 files changed

+169
-283
lines changed

docs/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2637,7 +2637,7 @@ <h4 id="contributing-building-build"><a class="link" href="#contributing-buildin
26372637
<div id="footer">
26382638
<div id="footer-text">
26392639
Version 2.0.10-SNAPSHOT<br>
2640-
Last updated 2021-02-17 22:38:31 +0100
2640+
Last updated 2021-03-13 16:16:47 +0100
26412641
</div>
26422642
</div>
26432643
<link rel="stylesheet" href="highlight/styles/github.min.css">

samples/java-webmvc/generated-docs/index.html

Lines changed: 26 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,7 +1207,7 @@ <h4 id="_example_request"><a class="anchor" href="#_example_request"></a><a clas
12071207
<div class="content">
12081208
<pre class="highlightjs highlight"><code data-lang="bash" class="language-bash hljs">$ curl 'http://localhost:8080/items' -i -X POST \
12091209
-H 'Content-Type: application/json' \
1210-
-H 'Authorization: Bearer 99d6ee1d-c96a-4385-b391-127dbfce4092' \
1210+
-H 'Authorization: Bearer 9779cd69-14d4-470b-9069-162881b61f96' \
12111211
-d '{"description":"Hot News"}'</code></pre>
12121212
</div>
12131213
</div>
@@ -1470,7 +1470,7 @@ <h4 id="_example_request_2"><a class="anchor" href="#_example_request_2"></a><a
14701470
<div class="content">
14711471
<pre class="highlightjs highlight"><code data-lang="bash" class="language-bash hljs">$ curl 'http://localhost:8080/items/1' -i -X PUT \
14721472
-H 'Content-Type: application/json' \
1473-
-H 'Authorization: Bearer 99d6ee1d-c96a-4385-b391-127dbfce4092' \
1473+
-H 'Authorization: Bearer 9779cd69-14d4-470b-9069-162881b61f96' \
14741474
-d '{"description":"Hot News"}'</code></pre>
14751475
</div>
14761476
</div>
@@ -1588,7 +1588,7 @@ <h4 id="_example_request_3"><a class="anchor" href="#_example_request_3"></a><a
15881588
<div class="listingblock">
15891589
<div class="content">
15901590
<pre class="highlightjs highlight"><code data-lang="bash" class="language-bash hljs">$ curl 'http://localhost:8080/items/1' -i -X DELETE \
1591-
-H 'Authorization: Bearer 99d6ee1d-c96a-4385-b391-127dbfce4092'</code></pre>
1591+
-H 'Authorization: Bearer 9779cd69-14d4-470b-9069-162881b61f96'</code></pre>
15921592
</div>
15931593
</div>
15941594
</div>
@@ -1918,123 +1918,6 @@ <h4 id="_query_parameters_5"><a class="anchor" href="#_query_parameters_5"></a><
19181918
</tr>
19191919
</tbody>
19201920
</table>
1921-
<div class="paragraph">
1922-
<p>Uses <a href="#overview-pagination">pagination</a> query params.</p>
1923-
</div>
1924-
<table class="tableblock frame-all grid-all stretch">
1925-
<colgroup>
1926-
<col style="width: 25%;">
1927-
<col style="width: 25%;">
1928-
<col style="width: 25%;">
1929-
<col style="width: 25%;">
1930-
</colgroup>
1931-
<thead>
1932-
<tr>
1933-
<th class="tableblock halign-left valign-top">Parameter</th>
1934-
<th class="tableblock halign-left valign-top">Type</th>
1935-
<th class="tableblock halign-left valign-top">Optional</th>
1936-
<th class="tableblock halign-left valign-top">Description</th>
1937-
</tr>
1938-
</thead>
1939-
<tbody>
1940-
<tr>
1941-
<td class="tableblock halign-left valign-top"><p class="tableblock">offset</p></td>
1942-
<td class="tableblock halign-left valign-top"><p class="tableblock">Integer</p></td>
1943-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
1944-
<td class="tableblock halign-left valign-top"></td>
1945-
</tr>
1946-
<tr>
1947-
<td class="tableblock halign-left valign-top"><p class="tableblock">paged</p></td>
1948-
<td class="tableblock halign-left valign-top"><p class="tableblock">Boolean</p></td>
1949-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
1950-
<td class="tableblock halign-left valign-top"></td>
1951-
</tr>
1952-
<tr>
1953-
<td class="tableblock halign-left valign-top"><p class="tableblock">sort</p></td>
1954-
<td class="tableblock halign-left valign-top"><p class="tableblock">Object</p></td>
1955-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
1956-
<td class="tableblock halign-left valign-top"></td>
1957-
</tr>
1958-
<tr>
1959-
<td class="tableblock halign-left valign-top"><p class="tableblock">sort.orders</p></td>
1960-
<td class="tableblock halign-left valign-top"><p class="tableblock">Array[Object]</p></td>
1961-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
1962-
<td class="tableblock halign-left valign-top"></td>
1963-
</tr>
1964-
<tr>
1965-
<td class="tableblock halign-left valign-top"><p class="tableblock">sort.orders[].direction</p></td>
1966-
<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
1967-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
1968-
<td class="tableblock halign-left valign-top"><p class="tableblock">Must be one of [ASC, DESC].</p></td>
1969-
</tr>
1970-
<tr>
1971-
<td class="tableblock halign-left valign-top"><p class="tableblock">sort.orders[].property</p></td>
1972-
<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
1973-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
1974-
<td class="tableblock halign-left valign-top"></td>
1975-
</tr>
1976-
<tr>
1977-
<td class="tableblock halign-left valign-top"><p class="tableblock">sort.orders[].ignoreCase</p></td>
1978-
<td class="tableblock halign-left valign-top"><p class="tableblock">Boolean</p></td>
1979-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
1980-
<td class="tableblock halign-left valign-top"></td>
1981-
</tr>
1982-
<tr>
1983-
<td class="tableblock halign-left valign-top"><p class="tableblock">sort.orders[].nullHandling</p></td>
1984-
<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
1985-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
1986-
<td class="tableblock halign-left valign-top"><p class="tableblock">Must be one of [NATIVE, NULLS_FIRST, NULLS_LAST].</p></td>
1987-
</tr>
1988-
<tr>
1989-
<td class="tableblock halign-left valign-top"><p class="tableblock">sort.orders[].ascending</p></td>
1990-
<td class="tableblock halign-left valign-top"><p class="tableblock">Boolean</p></td>
1991-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
1992-
<td class="tableblock halign-left valign-top"></td>
1993-
</tr>
1994-
<tr>
1995-
<td class="tableblock halign-left valign-top"><p class="tableblock">sort.orders[].descending</p></td>
1996-
<td class="tableblock halign-left valign-top"><p class="tableblock">Boolean</p></td>
1997-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
1998-
<td class="tableblock halign-left valign-top"></td>
1999-
</tr>
2000-
<tr>
2001-
<td class="tableblock halign-left valign-top"><p class="tableblock">sort.sorted</p></td>
2002-
<td class="tableblock halign-left valign-top"><p class="tableblock">Boolean</p></td>
2003-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
2004-
<td class="tableblock halign-left valign-top"></td>
2005-
</tr>
2006-
<tr>
2007-
<td class="tableblock halign-left valign-top"><p class="tableblock">sort.unsorted</p></td>
2008-
<td class="tableblock halign-left valign-top"><p class="tableblock">Boolean</p></td>
2009-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
2010-
<td class="tableblock halign-left valign-top"></td>
2011-
</tr>
2012-
<tr>
2013-
<td class="tableblock halign-left valign-top"><p class="tableblock">sort.empty</p></td>
2014-
<td class="tableblock halign-left valign-top"><p class="tableblock">Boolean</p></td>
2015-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
2016-
<td class="tableblock halign-left valign-top"></td>
2017-
</tr>
2018-
<tr>
2019-
<td class="tableblock halign-left valign-top"><p class="tableblock">pageNumber</p></td>
2020-
<td class="tableblock halign-left valign-top"><p class="tableblock">Integer</p></td>
2021-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
2022-
<td class="tableblock halign-left valign-top"></td>
2023-
</tr>
2024-
<tr>
2025-
<td class="tableblock halign-left valign-top"><p class="tableblock">pageSize</p></td>
2026-
<td class="tableblock halign-left valign-top"><p class="tableblock">Integer</p></td>
2027-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
2028-
<td class="tableblock halign-left valign-top"></td>
2029-
</tr>
2030-
<tr>
2031-
<td class="tableblock halign-left valign-top"><p class="tableblock">unpaged</p></td>
2032-
<td class="tableblock halign-left valign-top"><p class="tableblock">Boolean</p></td>
2033-
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
2034-
<td class="tableblock halign-left valign-top"></td>
2035-
</tr>
2036-
</tbody>
2037-
</table>
20381921
</div>
20391922
<div class="sect3">
20401923
<h4 id="_request_fields_7"><a class="anchor" href="#_request_fields_7"></a><a class="link" href="#_request_fields_7">2.7.4. Request fields</a></h4>
@@ -2250,8 +2133,8 @@ <h4 id="_example_response_5"><a class="anchor" href="#_example_response_5"></a><
22502133
"offset" : 0,
22512134
"pageNumber" : 0,
22522135
"pageSize" : 20,
2253-
"paged" : true,
2254-
"unpaged" : false
2136+
"unpaged" : false,
2137+
"paged" : true
22552138
},
22562139
"total" : 1,
22572140
"last" : true,
@@ -2460,11 +2343,14 @@ <h4 id="_path_parameters_8"><a class="anchor" href="#_path_parameters_8"></a><a
24602343
<div class="sect3">
24612344
<h4 id="_query_parameters_7"><a class="anchor" href="#_query_parameters_7"></a><a class="link" href="#_query_parameters_7">2.9.3. Query parameters</a></h4>
24622345
<div class="paragraph">
2463-
<p>No parameters.</p>
2346+
<p>Uses <a href="#overview-pagination">pagination</a> query params.</p>
24642347
</div>
24652348
</div>
24662349
<div class="sect3">
24672350
<h4 id="_request_fields_9"><a class="anchor" href="#_request_fields_9"></a><a class="link" href="#_request_fields_9">2.9.4. Request fields</a></h4>
2351+
<div class="paragraph">
2352+
<p>Uses <a href="#overview-pagination">pagination</a> query params.</p>
2353+
</div>
24682354
<table class="tableblock frame-all grid-all stretch">
24692355
<colgroup>
24702356
<col style="width: 25%;">
@@ -2487,6 +2373,19 @@ <h4 id="_request_fields_9"><a class="anchor" href="#_request_fields_9"></a><a cl
24872373
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
24882374
<td class="tableblock halign-left valign-top"><p class="tableblock">Command to execute.</p></td>
24892375
</tr>
2376+
<tr>
2377+
<td class="tableblock halign-left valign-top"><p class="tableblock">tag</p></td>
2378+
<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
2379+
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
2380+
<td class="tableblock halign-left valign-top"><p class="tableblock">Only items with this tag should be returned.</p></td>
2381+
</tr>
2382+
<tr>
2383+
<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
2384+
<td class="tableblock halign-left valign-top"><p class="tableblock">String</p></td>
2385+
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
2386+
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Deprecated.</strong></p>
2387+
<p class="tableblock">New item&#8217;s name.</p></td>
2388+
</tr>
24902389
</tbody>
24912390
</table>
24922391
</div>
@@ -2535,7 +2434,7 @@ <h4 id="_example_request_7"><a class="anchor" href="#_example_request_7"></a><a
25352434
<div class="content">
25362435
<pre class="highlightjs highlight"><code data-lang="bash" class="language-bash hljs">$ curl 'http://localhost:8080/items/1/process' -i -X POST \
25372436
-H 'Content-Type: application/x-www-form-urlencoded' \
2538-
-d 'command=increase'</code></pre>
2437+
-d 'command=increase&amp;tag=processed&amp;page=1&amp;name=myitem'</code></pre>
25392438
</div>
25402439
</div>
25412440
</div>
@@ -2551,10 +2450,10 @@ <h4 id="_example_response_7"><a class="anchor" href="#_example_response_7"></a><
25512450
Pragma: no-cache
25522451
Expires: 0
25532452
X-Frame-Options: DENY
2554-
Content-Length: 55
2453+
Content-Length: 161
25552454

25562455
{
2557-
"output" : "Command executed on item 1: increase"
2456+
"output" : "Command executed on item 1: increase, method: POST, tag: processed, data: myitem, errors: 0, Page request [number: 1, size 20, sort: UNSORTED]"
25582457
}</code></pre>
25592458
</div>
25602459
</div>
@@ -3724,7 +3623,7 @@ <h4 id="_example_request_13"><a class="anchor" href="#_example_request_13"></a><
37243623
<div class="content">
37253624
<pre class="highlightjs highlight"><code data-lang="bash" class="language-bash hljs">$ curl 'http://localhost:8080/items/filtered/1' -i -X PUT \
37263625
-H 'Content-Type: application/json' \
3727-
-H 'Authorization: Bearer 99d6ee1d-c96a-4385-b391-127dbfce4092' \
3626+
-H 'Authorization: Bearer 9779cd69-14d4-470b-9069-162881b61f96' \
37283627
-d '{"description":"Hot News"}'</code></pre>
37293628
</div>
37303629
</div>

samples/java-webmvc/src/main/java/capital/scalable/restdocs/example/items/ItemResource.java

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.net.URI;
3434
import java.util.Collections;
3535
import java.util.List;
36+
import java.util.Locale;
3637

3738
import capital.scalable.restdocs.example.common.Money;
3839
import capital.scalable.restdocs.example.constraints.English;
@@ -43,8 +44,10 @@
4344
import org.springframework.data.domain.Pageable;
4445
import org.springframework.hateoas.EntityModel;
4546
import org.springframework.http.HttpEntity;
47+
import org.springframework.http.HttpMethod;
4648
import org.springframework.http.HttpStatus;
4749
import org.springframework.http.ResponseEntity;
50+
import org.springframework.validation.Errors;
4851
import org.springframework.web.bind.annotation.DeleteMapping;
4952
import org.springframework.web.bind.annotation.GetMapping;
5053
import org.springframework.web.bind.annotation.ModelAttribute;
@@ -240,10 +243,19 @@ public String processAllItems(@RequestBody String command) {
240243
* @title Process One Item
241244
*/
242245
@PostMapping("{itemId}/process")
243-
public CommandResult processSingleItem(@PathVariable String itemId,
244-
@ModelAttribute Command command) {
246+
public CommandResult processSingleItem(
247+
@PathVariable String itemId,
248+
@ModelAttribute Command command,
249+
HttpMethod method,
250+
@ModelAttribute Filter filter,
251+
Pageable page,
252+
Errors errors,
253+
CloneData data
254+
) {
245255
return new CommandResult(
246-
String.format("Command executed on item %s: %s", itemId, command.getCommand()));
256+
String.format("Command executed on item %s: %s, method: %s, tag: %s, data: %s, errors: %s, %s",
257+
itemId, command.getCommand(), method, filter.tag, data.name,
258+
errors.getAllErrors().size(), page));
247259
}
248260

249261
/**
@@ -282,7 +294,8 @@ public HypermediaItemResponse getHypermediaItem(@PathVariable("id") @Id String i
282294
HypermediaItemResponse response = new HypermediaItemResponse(id, "hypermedia item");
283295
response.add(linkTo(methodOn(ItemResource.class).getHypermediaItem(id, embedded)).withSelfRel());
284296
response.add(linkTo(methodOn(ItemResource.class).getItem(id)).withRel("classicItem"));
285-
response.add(linkTo(methodOn(ItemResource.class).processSingleItem(id, null)).withRel("process"));
297+
response.add(linkTo(methodOn(ItemResource.class).processSingleItem(id, null, null, null, null, null, null))
298+
.withRel("process"));
286299
if (embedded != null && embedded) {
287300
response.addEmbedded("children", new Object[] { CHILD });
288301
response.addEmbedded("attributes", ATTRIBUTES);
@@ -338,6 +351,21 @@ static class CloneData {
338351
*/
339352
@Deprecated
340353
private String name;
354+
355+
public CloneData() {
356+
}
357+
358+
public CloneData(String name) {
359+
this.name = name;
360+
}
361+
362+
public String getName() {
363+
return name;
364+
}
365+
366+
public void setName(String name) {
367+
this.name = name;
368+
}
341369
}
342370

343371
static class Command {
@@ -388,5 +416,20 @@ static class Filter {
388416
* Only items with this tag should be returned.
389417
*/
390418
private String tag;
419+
420+
public Filter() {
421+
}
422+
423+
public Filter(String tag) {
424+
this.tag = tag;
425+
}
426+
427+
public String getTag() {
428+
return tag;
429+
}
430+
431+
public void setTag(String tag) {
432+
this.tag = tag;
433+
}
391434
}
392435
}

samples/java-webmvc/src/test/java/capital/scalable/restdocs/example/items/ItemResourceTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,12 @@ public void processAllItems() throws Exception {
151151
public void processSingleItem() throws Exception {
152152
mockMvc.perform(post("/items/{itemId}/process", "1")
153153
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
154-
.content("command=increase"))
154+
.content("command=increase&tag=processed&page=1&name=myitem"))
155155
.andExpect(status().isOk())
156156
.andExpect(
157-
content().json("{ \"output\": \"Command executed on item 1: increase\" }"));
157+
content().json("{ \"output\": \"Command executed on item 1: increase, method: POST, " +
158+
"tag: processed, data: myitem, errors: 0, " +
159+
"Page request [number: 1, size 20, sort: UNSORTED]\" }"));
158160
}
159161

160162
@Test

0 commit comments

Comments
 (0)