15
15
*/
16
16
package org .springframework .data .web .config ;
17
17
18
+ import java .io .IOException ;
18
19
import java .util .List ;
19
20
20
21
import org .slf4j .Logger ;
31
32
32
33
import com .fasterxml .jackson .databind .BeanDescription ;
33
34
import com .fasterxml .jackson .databind .SerializationConfig ;
34
- import com .fasterxml .jackson .databind .annotation .JsonSerialize ;
35
35
import com .fasterxml .jackson .databind .module .SimpleModule ;
36
36
import com .fasterxml .jackson .databind .ser .BeanPropertyWriter ;
37
37
import com .fasterxml .jackson .databind .ser .BeanSerializerModifier ;
38
38
import com .fasterxml .jackson .databind .ser .std .ToStringSerializerBase ;
39
39
import com .fasterxml .jackson .databind .util .StdConverter ;
40
+ import com .fasterxml .jackson .core .JsonGenerator ;
41
+ import com .fasterxml .jackson .databind .JsonSerializer ;
42
+ import com .fasterxml .jackson .databind .SerializerProvider ;
40
43
41
44
/**
42
45
* JavaConfig class to export Jackson specific configuration.
@@ -53,8 +56,12 @@ public GeoModule jacksonGeoModule() {
53
56
}
54
57
55
58
@ Bean
56
- public PageModule pageModule () {
57
- return new PageModule (settings );
59
+ public PageModule pageModule (@ Autowired (required = false ) PageModuleCustomizer customizer ) {
60
+ PageModule module = new PageModule (settings );
61
+ if (customizer != null ) {
62
+ customizer .customize (module );
63
+ }
64
+ return module ;
58
65
}
59
66
60
67
/**
@@ -79,6 +86,9 @@ public static class PageModule extends SimpleModule {
79
86
UNPAGED_TYPE = ClassUtils .resolveClassName (UNPAGED_TYPE_NAME , PageModule .class .getClassLoader ());
80
87
}
81
88
89
+ private boolean oneIndexedParameters ;
90
+ private PageModelConverter pageModelConverter ;
91
+
82
92
/**
83
93
* Creates a new {@link PageModule} for the given {@link SpringDataWebSettings}.
84
94
*
@@ -92,10 +102,39 @@ public PageModule(@Nullable SpringDataWebSettings settings) {
92
102
setSerializerModifier (new WarningLoggingModifier ());
93
103
94
104
} else {
95
- setMixInAnnotation (PageImpl .class , WrappingMixing .class );
105
+ pageModelConverter = new PageModelConverter ();
106
+ addSerializer (PageImpl .class , new JsonSerializer <>() {
107
+ @ Override
108
+ public void serialize (PageImpl page , JsonGenerator gen , SerializerProvider providers ) throws IOException {
109
+ gen .writeObject (pageModelConverter .convert (page ));
110
+ }
111
+ });
96
112
}
97
113
}
98
114
115
+ /**
116
+ * Configures whether to expose and assume 1-based page number indexes in the request parameters. Defaults to
117
+ * {@literal false}, meaning a page number of 0 in the request equals the first page. If this is set to
118
+ * {@literal true}, a page number of 1 in the request will be considered the first page.
119
+ *
120
+ * @param oneIndexedParameters the oneIndexedParameters to set
121
+ */
122
+ public void setOneIndexedParameters (boolean oneIndexedParameters ) {
123
+ this .oneIndexedParameters = oneIndexedParameters ;
124
+ this .pageModelConverter .setOneIndexedParameters (oneIndexedParameters );
125
+ }
126
+
127
+ /**
128
+ * Indicates whether to expose and assume 1-based page number indexes in the request parameters. Defaults to
129
+ * {@literal false}, meaning a page number of 0 in the request equals the first page. If this is set to
130
+ * {@literal true}, a page number of 1 in the request will be considered the first page.
131
+ *
132
+ * @return whether to assume 1-based page number indexes in the request parameters.
133
+ */
134
+ public boolean isOneIndexedParameters () {
135
+ return oneIndexedParameters ;
136
+ }
137
+
99
138
/**
100
139
* A Jackson serializer rendering instances of {@link org.springframework.data.domain.Unpaged} as {@code INSTANCE}
101
140
* as it was previous rendered.
@@ -116,15 +155,18 @@ public String valueToString(@Nullable Object value) {
116
155
}
117
156
}
118
157
119
- @ JsonSerialize (converter = PageModelConverter .class )
120
- abstract class WrappingMixing {}
121
-
122
158
static class PageModelConverter extends StdConverter <Page <?>, PagedModel <?>> {
123
159
160
+ public boolean oneIndexedParameters ;
161
+
162
+ public void setOneIndexedParameters (boolean oneIndexedParameters ) {
163
+ this .oneIndexedParameters = oneIndexedParameters ;
164
+ }
165
+
124
166
@ Nullable
125
167
@ Override
126
168
public PagedModel <?> convert (@ Nullable Page <?> value ) {
127
- return value == null ? null : new PagedModel <>(value );
169
+ return value == null ? null : new PagedModel <>(value , oneIndexedParameters );
128
170
}
129
171
}
130
172
0 commit comments