Skip to content

Commit b789900

Browse files
committed
feat(jackson): add SbxNamingStrategy for cleaner entity definitions
- Add SbxNamingStrategy to auto-map key→_KEY and meta→_META - Entities now use @JsonNaming instead of @JsonProperty - Update InventoryHistory and tests to use new pattern - Update README with cleaner syntax Before: @JsonProperty("_KEY") String key, @JsonProperty("_META") SBXMeta meta, After: @JsonNaming(SbxNamingStrategy.class) String key, // auto-mapped SBXMeta meta, // auto-mapped
1 parent 82b0751 commit b789900

File tree

4 files changed

+90
-21
lines changed

4 files changed

+90
-21
lines changed

README.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -309,11 +309,12 @@ The library provides a Spring Data-like repository pattern for type-safe, boiler
309309
### Define Your Entity
310310

311311
```java
312-
@SbxModel("contact") // Maps to SBX model name
312+
@SbxModel("contact") // Maps to SBX model name
313+
@JsonNaming(SbxNamingStrategy.class) // Auto-maps key→_KEY, meta→_META
313314
@JsonIgnoreProperties(ignoreUnknown = true)
314315
public record Contact(
315-
@JsonProperty("_KEY") String key,
316-
@JsonProperty("_META") SBXMeta meta,
316+
String key, // Automatically mapped to _KEY
317+
SBXMeta meta, // Automatically mapped to _META
317318
String name,
318319
String email,
319320
String status
@@ -403,25 +404,26 @@ contacts.query().where(...).execute(); // Full SBXFindResponse<T>
403404
The library uses Java records for immutable data classes:
404405

405406
```java
406-
// Simple model (without repository pattern)
407+
// Full repository pattern (recommended)
408+
@SbxModel("contact")
409+
@JsonNaming(SbxNamingStrategy.class)
410+
@JsonIgnoreProperties(ignoreUnknown = true)
407411
public record Contact(
408-
@JsonProperty("_KEY") String key,
412+
String key,
413+
SBXMeta meta,
409414
String name,
410415
String email,
411-
String status,
412-
@JsonProperty("_META") SBXMeta meta
413-
) {}
416+
String status
417+
) implements SbxEntity {}
414418

415-
// With repository pattern
416-
@SbxModel("contact")
417-
@JsonIgnoreProperties(ignoreUnknown = true)
419+
// Simple model (without repository, needs @JsonProperty)
418420
public record Contact(
419421
@JsonProperty("_KEY") String key,
420422
@JsonProperty("_META") SBXMeta meta,
421423
String name,
422424
String email,
423425
String status
424-
) implements SbxEntity {}
426+
) {}
425427
```
426428

427429
## Error Handling
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.sbxcloud.sbx.jackson;
2+
3+
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
4+
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
5+
import com.fasterxml.jackson.databind.cfg.MapperConfig;
6+
import com.fasterxml.jackson.databind.introspect.AnnotatedField;
7+
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
8+
import com.fasterxml.jackson.databind.introspect.AnnotatedParameter;
9+
10+
/**
11+
* Jackson naming strategy for SBX entities.
12+
* <p>
13+
* Automatically maps:
14+
* <ul>
15+
* <li>{@code key} ↔ {@code _KEY}</li>
16+
* <li>{@code meta} ↔ {@code _META}</li>
17+
* </ul>
18+
* Other fields are left unchanged (camelCase).
19+
*
20+
* <pre>{@code
21+
* @SbxModel("contact")
22+
* @JsonNaming(SbxNamingStrategy.class)
23+
* public record Contact(
24+
* String key, // maps to _KEY
25+
* SBXMeta meta, // maps to _META
26+
* String name, // stays as "name"
27+
* String email // stays as "email"
28+
* ) implements SbxEntity {}
29+
* }</pre>
30+
*/
31+
public class SbxNamingStrategy extends PropertyNamingStrategy {
32+
33+
@Override
34+
public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) {
35+
return translate(defaultName);
36+
}
37+
38+
@Override
39+
public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
40+
return translate(defaultName);
41+
}
42+
43+
@Override
44+
public String nameForSetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
45+
return translate(defaultName);
46+
}
47+
48+
@Override
49+
public String nameForConstructorParameter(MapperConfig<?> config, AnnotatedParameter ctorParam, String defaultName) {
50+
return translate(defaultName);
51+
}
52+
53+
private String translate(String name) {
54+
return switch (name) {
55+
case "key" -> "_KEY";
56+
case "meta" -> "_META";
57+
default -> name;
58+
};
59+
}
60+
}

src/test/java/com/sbxcloud/sbx/SbxModuleTest.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package com.sbxcloud.sbx;
22

33
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4-
import com.fasterxml.jackson.annotation.JsonProperty;
54
import com.fasterxml.jackson.databind.DeserializationFeature;
65
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
77
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
88
import com.sbxcloud.sbx.annotation.SbxEntity;
99
import com.sbxcloud.sbx.annotation.SbxModel;
1010
import com.sbxcloud.sbx.jackson.SbxModule;
11+
import com.sbxcloud.sbx.jackson.SbxNamingStrategy;
1112
import com.sbxcloud.sbx.model.SBXMeta;
1213
import org.junit.jupiter.api.BeforeEach;
1314
import org.junit.jupiter.api.Test;
@@ -113,21 +114,23 @@ void shouldRoundTripCorrectly() throws Exception {
113114
assertEquals(original.name(), deserialized.name());
114115
}
115116

116-
// Test entities with proper @JsonProperty annotations
117+
// Test entities using SbxNamingStrategy - no @JsonProperty needed!
117118

118119
@SbxModel("test")
120+
@JsonNaming(SbxNamingStrategy.class)
119121
@JsonIgnoreProperties(ignoreUnknown = true)
120122
record TestEntity(
121-
@JsonProperty("_KEY") String key,
122-
@JsonProperty("_META") SBXMeta meta,
123+
String key, // Auto-mapped to _KEY
124+
SBXMeta meta, // Auto-mapped to _META
123125
String name
124126
) implements SbxEntity {}
125127

126128
@SbxModel("test_fields")
129+
@JsonNaming(SbxNamingStrategy.class)
127130
@JsonIgnoreProperties(ignoreUnknown = true)
128131
record TestEntityWithFields(
129-
@JsonProperty("_KEY") String key,
130-
@JsonProperty("_META") SBXMeta meta,
132+
String key,
133+
SBXMeta meta,
131134
String name,
132135
Integer count,
133136
Boolean active

src/test/java/com/sbxcloud/sbx/model/InventoryHistory.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
package com.sbxcloud.sbx.model;
22

33
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4-
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
55
import com.sbxcloud.sbx.annotation.SbxEntity;
66
import com.sbxcloud.sbx.annotation.SbxModel;
7+
import com.sbxcloud.sbx.jackson.SbxNamingStrategy;
78

89
/**
910
* Test model for inventory_history records in SBX domain 96.
11+
* <p>
12+
* Clean syntax using @JsonNaming - no @JsonProperty needed!
1013
*/
1114
@SbxModel("inventory_history")
15+
@JsonNaming(SbxNamingStrategy.class)
1216
@JsonIgnoreProperties(ignoreUnknown = true)
1317
public record InventoryHistory(
14-
@JsonProperty("_KEY") String key,
15-
@JsonProperty("_META") SBXMeta meta,
18+
String key, // Auto-mapped to _KEY
19+
SBXMeta meta, // Auto-mapped to _META
1620
String masterlist,
1721
Integer week,
1822
Double price,

0 commit comments

Comments
 (0)