Skip to content

Commit e7199a5

Browse files
committed
feat: improve FriendlyId value object API
- Add parse() method accepting both UUID and FriendlyId string formats - Add friendlyId(UUID) factory method for static import usage - Add toUuid() method for symmetry with parse() - Add value() method returning the FriendlyId string - Update @SInCE annotation to 2.0 - Use static imports in deserializers - Update migration documentation
1 parent 8bdb5af commit e7199a5

12 files changed

Lines changed: 182 additions & 56 deletions

File tree

README.md

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -367,17 +367,23 @@ import com.devskiller.friendly_id.type.FriendlyId;
367367
// Create from UUID
368368
FriendlyId id = FriendlyId.of(uuid);
369369

370-
// Create from string
371-
FriendlyId id = FriendlyId.fromString("5wbwf6yUxVBcr48AMbz9cb");
370+
// Or use static import friendly method
371+
import static com.devskiller.friendly_id.type.FriendlyId.friendlyId;
372+
FriendlyId id = friendlyId(uuid);
373+
374+
// Parse from string (accepts both FriendlyId and UUID formats)
375+
FriendlyId id = FriendlyId.parse("5wbwf6yUxVBcr48AMbz9cb");
376+
FriendlyId id = FriendlyId.parse("c3587ec5-0976-497f-8374-61e0c2ea3da5");
372377

373378
// Create random
374379
FriendlyId id = FriendlyId.random();
375380

376381
// Get UUID
377-
UUID uuid = id.uuid();
382+
UUID uuid = id.toUuid();
378383

379384
// Get string representation
380-
String friendlyIdString = id.toString();
385+
String friendlyIdString = id.value(); // Returns FriendlyId string
386+
String friendlyIdString = id.toString(); // Same as value()
381387
```
382388

383389
The value object can be used in:

friendly-id-jackson-datatype/src/main/java/com/devskiller/friendly_id/jackson/FriendlyIdDeserializer.java

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99
import tools.jackson.databind.ValueDeserializer;
1010
import tools.jackson.databind.deser.std.StdDeserializer;
1111

12-
import com.devskiller.friendly_id.FriendlyId;
1312
import com.devskiller.friendly_id.FriendlyIdFormat;
1413
import com.devskiller.friendly_id.IdFormat;
1514

15+
import static com.devskiller.friendly_id.type.FriendlyId.parse;
16+
1617
public class FriendlyIdDeserializer extends StdDeserializer<UUID> {
1718

1819
private final boolean useFriendlyFormat;
@@ -32,36 +33,14 @@ public UUID deserialize(JsonParser parser, DeserializationContext ctxt) {
3233
if (token == JsonToken.VALUE_STRING) {
3334
var value = parser.getString().trim();
3435
if (useFriendlyFormat) {
35-
return parseAsUuidOrFriendlyId(value);
36+
return parse(value).toUuid();
3637
} else {
3738
return UUID.fromString(value);
3839
}
3940
}
4041
throw ctxt.weirdStringException(parser.getString(), UUID.class, "Expected UUID string value");
4142
}
4243

43-
/**
44-
* Attempts to parse the value as a standard UUID first, then falls back to FriendlyId format.
45-
* This approach is more robust than heuristic-based detection.
46-
*/
47-
private UUID parseAsUuidOrFriendlyId(String value) {
48-
if (isStandardUuidFormat(value)) {
49-
return UUID.fromString(value);
50-
}
51-
return FriendlyId.toUuid(value);
52-
}
53-
54-
/**
55-
* Checks if the string matches standard UUID format (36 chars with hyphens at positions 8, 13, 18, 23).
56-
*/
57-
private boolean isStandardUuidFormat(String value) {
58-
return value.length() == 36
59-
&& value.charAt(8) == '-'
60-
&& value.charAt(13) == '-'
61-
&& value.charAt(18) == '-'
62-
&& value.charAt(23) == '-';
63-
}
64-
6544
@Override
6645
public ValueDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) {
6746
if (property != null) {

friendly-id-jackson-datatype/src/main/java/com/devskiller/friendly_id/jackson/FriendlyIdValueDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ public FriendlyIdValueDeserializer() {
1919
@Override
2020
public FriendlyId deserialize(JsonParser p, DeserializationContext ctxt) {
2121
String friendlyIdString = p.getString();
22-
return FriendlyId.fromString(friendlyIdString);
22+
return FriendlyId.parse(friendlyIdString);
2323
}
2424
}

friendly-id-jackson2-datatype/src/main/java/com/devskiller/friendly_id/jackson2/FriendlyIdValueDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ public class FriendlyIdValueDeserializer extends JsonDeserializer<FriendlyId> {
1717
@Override
1818
public FriendlyId deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
1919
String friendlyIdString = p.getValueAsString();
20-
return FriendlyId.fromString(friendlyIdString);
20+
return FriendlyId.parse(friendlyIdString);
2121
}
2222
}

friendly-id-jooq/src/main/java/com/devskiller/friendly_id/jooq/FriendlyIdConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
* <h2>Manual Usage Example</h2>
4545
* <pre>{@code
4646
* // Query using FriendlyId
47-
* FriendlyId friendlyId = FriendlyId.fromString("5wbwf6yUxVBcr48AMbz9cb");
47+
* FriendlyId friendlyId = FriendlyId.parse("5wbwf6yUxVBcr48AMbz9cb");
4848
* UserRecord user = create
4949
* .selectFrom(USER)
5050
* .where(USER.ID.eq(friendlyId))

friendly-id-jooq/src/test/java/com/devskiller/friendly_id/jooq/FriendlyIdConverterTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ void shouldConvertUuidToFriendlyId() {
2727
@Test
2828
void shouldConvertFriendlyIdToUuid() {
2929
// given
30-
FriendlyId friendlyId = FriendlyId.fromString("5wbwf6yUxVBcr48AMbz9cb");
30+
FriendlyId friendlyId = FriendlyId.parse("5wbwf6yUxVBcr48AMbz9cb");
3131

3232
// when
3333
UUID uuid = converter.to(friendlyId);

friendly-id-jpa/src/main/java/com/devskiller/friendly_id/jpa/FriendlyIdConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
* <h2>Query Examples</h2>
4343
* <pre>{@code
4444
* // JPQL - use UUID parameter
45-
* FriendlyId userId = FriendlyId.fromString("5wbwf6yUxVBcr48AMbz9cb");
45+
* FriendlyId userId = FriendlyId.parse("5wbwf6yUxVBcr48AMbz9cb");
4646
* User user = em.createQuery("SELECT u FROM User u WHERE u.id = :id", User.class)
4747
* .setParameter("id", userId)
4848
* .getSingleResult();

friendly-id-jpa/src/test/java/com/devskiller/friendly_id/jpa/FriendlyIdConverterTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class FriendlyIdConverterTest {
1515
@Test
1616
void shouldConvertFriendlyIdToUuid() {
1717
// given
18-
FriendlyId friendlyId = FriendlyId.fromString("5wbwf6yUxVBcr48AMbz9cb");
18+
FriendlyId friendlyId = FriendlyId.parse("5wbwf6yUxVBcr48AMbz9cb");
1919

2020
// when
2121
UUID uuid = converter.convertToDatabaseColumn(friendlyId);

friendly-id-openfeign/src/main/java/com/devskiller/friendly_id/openfeign/FriendlyIdDecoder.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import feign.codec.DecodeException;
1212
import feign.codec.Decoder;
1313

14+
import static com.devskiller.friendly_id.type.FriendlyId.parse;
15+
1416
/**
1517
* Feign decoder that converts FriendlyId strings to UUID and FriendlyId objects in responses.
1618
* <p>
@@ -45,7 +47,7 @@ public Object decode(Response response, Type type) throws IOException, DecodeExc
4547
}
4648

4749
if (type == com.devskiller.friendly_id.type.FriendlyId.class && decoded instanceof String stringValue) {
48-
return com.devskiller.friendly_id.type.FriendlyId.fromString(stringValue);
50+
return parse(stringValue);
4951
}
5052

5153
return decoded;

friendly-id-spring-boot/src/main/java/com/devskiller/friendly_id/spring/FriendlyIdConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public void addFormatters(FormatterRegistry registry) {
3434
registry.addConverter(String.class, UUID.class, id -> toUuid(id));
3535
registry.addConverter(UUID.class, String.class, id -> toFriendlyId(id));
3636
registry.addConverter(String.class, com.devskiller.friendly_id.type.FriendlyId.class,
37-
com.devskiller.friendly_id.type.FriendlyId::fromString);
37+
com.devskiller.friendly_id.type.FriendlyId::parse);
3838
registry.addConverter(com.devskiller.friendly_id.type.FriendlyId.class, String.class,
3939
com.devskiller.friendly_id.type.FriendlyId::toString);
4040
}

0 commit comments

Comments
 (0)