-
Notifications
You must be signed in to change notification settings - Fork 39
Expand file tree
/
Copy pathRELEASE-NOTES.txt
More file actions
767 lines (617 loc) · 43.5 KB
/
RELEASE-NOTES.txt
File metadata and controls
767 lines (617 loc) · 43.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
***************************************************************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
* distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
* to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
* with the License. You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
* specific language governing permissions and limitations under the License. *
***************************************************************************************************************************
Release Notes - Juneau - Version 9.2.1 - YYYY-MM-DD
** New Features - CBOR (Concise Binary Object Representation) Support
* New CborSerializer and CborParser for CBOR format per RFC 8949.
* Media types: produces application/cbor, accepts application/cbor.
* CBOR provides compact binary encoding for JSON-like data; ideal for IoT, constrained environments,
and WebAuthn. Same data model as JSON and MsgPack: maps, arrays, strings, numbers, booleans, null.
* Full round-trip support for beans, maps, collections, primitives, byte arrays, date/time/Duration,
Optional, ObjectSwap, and polymorphic _type resolution.
* New classes: CborSerializer, CborParser, CborOutputStream, CborInputStream, DataType,
CborSerializerSession, CborParserSession, CborMetaProvider, CborClassMeta, CborBeanPropertyMeta.
* New marshaller: org.apache.juneau.marshaller.Cbor with static of()/to() convenience methods.
* New annotations: @Cbor (class-level), @CborConfig (addBeanTypes, useTags).
* SpacedHex and Base64 variants for text-friendly output (debugging, testing).
* CBOR included in BasicUniversalConfig for REST resources.
* RestClient recognizes application/cbor for automatic serializer/parser selection.
** New Features - Hjson (Human JSON) Support
* New HjsonSerializer and HjsonParser for Hjson (Human JSON) format.
* Media types: produces application/hjson, accepts application/hjson and application/hjson+json.
* Hjson extends JSON with human-friendly syntax designed for configuration files and hand-edited data:
- Quoteless string values — unquoted strings ending at the newline (e.g. name: Alice)
- Multiline strings — triple-single-quote ''' blocks with automatic indentation stripping
- Comments — # single-line, // single-line, and /* ... */ block comments
- Optional commas — newlines serve as member/element separators
- Trailing commas — ignored
- Unquoted keys — object keys need not be quoted when safe
- Root-braceless objects — top-level objects can omit the surrounding {}
* Serializer options: useWhitespace, useQuotelessStrings, useQuotelessKeys, useMultilineStrings,
omitRootBraces, useNewlineSeparators.
* Full round-trip support for all standard Juneau data types: beans, maps, collections, arrays,
primitives, Optional, byte arrays, Date/time/Duration, ObjectSwap/surrogate transforms,
polymorphic _type resolution, builder-pattern beans, and non-static inner classes.
* New classes: HjsonSerializer, HjsonParser, HjsonSerializerSession, HjsonParserSession,
HjsonTokenizer, HjsonWriter, HjsonClassMeta, HjsonBeanPropertyMeta, HjsonMetaProvider.
* New marshaller class: org.apache.juneau.marshaller.Hjson with static of()/to() convenience methods.
* New annotations: @Hjson (class-level), @HjsonConfig (config-level).
* Hjson included in BasicUniversalConfig for REST resources.
* RestClient recognizes Hjson media types for automatic serializer/parser selection.
** New Features - HOCON (Human-Optimized Config Object Notation) Support
* New HoconSerializer and HoconParser for HOCON format (used by Akka, Play, sbt, Spark, Kafka).
* Media types: produces application/hocon, accepts application/hocon.
* HOCON extends JSON with configuration-friendly syntax:
- Key-value separators: = (convention), : (JSON-style), or space-brace for objects
- Path expressions: a.b.c = value expands to nested objects
- Unquoted strings for keys and simple values
- Object merging: duplicate keys merge instead of overwrite
- Substitutions: ${var} and ${?var} (optional) resolved after parse
- Triple-quoted strings """...""" for multi-line
- Comments: # and //
- Optional root braces
* Serializer options: useEqualsSign, useUnquotedStrings, useUnquotedKeys, omitRootBraces,
useMultilineStrings, useNewlineSeparators.
* Full round-trip support for beans, maps, collections, primitives, date/time/Duration,
Optional, ObjectSwap, and polymorphic _type resolution.
* New classes: HoconSerializer, HoconParser, HoconSerializerSession, HoconParserSession,
HoconTokenizer, HoconWriter, HoconValue, HoconResolver, HoconMetaProvider.
* New marshaller: org.apache.juneau.marshaller.Hocon with of()/to() convenience methods.
* New annotations: @Hocon (class-level), @HoconConfig (config-level).
* HOCON included in BasicUniversalConfig for REST resources.
* RestClient recognizes application/hocon for automatic serializer/parser selection.
* Parser enhancements: += array append, self-referential substitution (path = ${path}"/bin"),
value concatenation (/usr "/local" → /usr/local), array concatenation ([1,2] [3,4]),
and object concatenation ({a:1} {b:2}).
** New Features - JSONL (JSON Lines) Support
* New JsonlSerializer and JsonlParser for JSONL (JSON Lines / NDJSON) format.
* Media types: produces application/jsonl, accepts application/jsonl, application/x-ndjson, text/jsonl.
* Each line is a valid JSON value; collections and arrays serialize one element per line.
* Supports beans, maps, collections, scalars, ObjectSwaps, and streaming (Iterator, Iterable, Stream).
* New classes: JsonlSerializer, JsonlParser, Jsonl (marshaller), JsonlConfig.
* JSONL included in BasicUniversalConfig for REST resources.
* Round-trip parity with JSON for all data types; ideal for LLM datasets, streaming, and bulk pipelines.
** New Features - Protobuf Text Format Support
* New ProtoSerializer and ProtoParser for the human-readable Protobuf Text Format (NOT binary wire format).
* Media types: produces text/protobuf, accepts text/protobuf and text/x-protobuf.
* No .proto schema files required—Java bean metadata provides the type information.
* Supports beans, maps, collections, scalars, repeated fields, and nested messages.
* Date/time and Duration types serialized as ISO 8601 strings.
* New classes: ProtoSerializer, ProtoParser, Proto (marshaller), ProtoWriter, ProtoTokenizer.
* New annotations: @Proto (comment), @ProtoConfig (useListSyntaxForBeans, useColonForMessages).
* BasicProtoConfig REST interface for Proto-only resources; Proto included in BasicUniversalConfig.
** New Features - CSV Marshalling Parity with JSON
* Type discriminator: addBeanTypes().addRootType() adds _type column for polymorphic parsing.
* Byte arrays: byteArrayFormat(BASE64) or SEMICOLON_DELIMITED; primitive arrays as [1;2;3].
* Nested structures: allowNestedStructures(true) enables inline {key:val} and [val;val] in cells.
* Null marker: nullValue("<NULL>") (default) for unambiguous null serialization/parsing.
* New classes: CsvCellParser, CsvCellSerializer, ByteArrayFormat.
* New builder options: byteArrayFormat(), allowNestedStructures(), nullValue().
** New Features - Per-Session Property Overrides
* Session.Builder.property(String, Object) and properties(Map) now dispatch to typed
session-level setter methods, enabling per-request override of serializer/parser configuration.
* Both short names (e.g., "locale") and fully-qualified names (e.g., "BeanSession.locale") are
accepted as property keys.
* New properties exposed as session-level overrides:
- ParserSession: trimStrings
- BeanTraverseSession: initialDepth
- SerializerSession: keepNullProperties, trimStrings, addBeanTypes, addRootType,
sortCollections, sortMaps, trimEmptyCollections, trimEmptyMaps
- WriterSerializerSession: maxIndent, quoteChar
- CsvSerializerSession: byteArrayFormat, allowNestedStructures, nullValue
- JsonSerializerSession: escapeSolidus
- JsonParserSession: validateEnd
- UonSerializerSession: encoding, paramFormat (also fixes quoteChar bypass)
- UonParserSession: validateEnd
- UrlEncodingSerializerSession: expandedParams
- UrlEncodingParserSession: expandedParams
- XmlSerializerSession: addNamespaceUrisToRoot, autoDetectNamespaces, defaultNamespace,
enableNamespaces, textNodeDelimiter
- XmlParserSession: preserveRootElement, validating
- HtmlSerializerSession: addKeyValueTableHeaders, detectLabelParameters,
detectLinksInStrings, labelParameter, uriAnchorText
* Bug fixes - several serializer sessions were bypassing the session-level addBeanTypes field by
overriding isAddBeanTypes() to return ctx.isAddBeanTypes() directly. These overrides now
correctly delegate to the session field via super.isAddBeanTypes(). Affected classes:
JsonSerializerSession, UonSerializerSession, XmlSerializerSession, HtmlSerializerSession,
MsgPackSerializerSession, YamlSerializerSession, CborSerializerSession, BsonSerializerSession,
RdfSerializerSession, RdfStreamSerializerSession. Similarly, ParserSession.isTrimStrings()
now returns the session-level field instead of delegating to the context.
* Example: serializer.createSession().property("locale", "fr-FR").build()
is equivalent to serializer.createSession().locale(Locale.forLanguageTag("fr-FR")).build()
* BasicConverter handles type coercion so string values (e.g., "true", "fr-FR") are
automatically converted to the expected target types.
** Changes
* Bump junit.version from a mix of 5.13.4 and 6.0.1 to 6.0.3.
* Bump maven.compiler.source in examples from a mix for 1.8 and 17 to 17 (inherited from parent POM when possible).
* Bump maven.compiler.target in examples from a mix for 1.8 and 17 to 17 (inherited from parent POM when possible).
* Bump maven.compiler.source in juneau-rest-server-springboot from a mix for 1.8 and 17 to 17 (inherited from parent POM).
* Bump maven.compiler.target in juneau-rest-server-springboot from a mix for 1.8 and 17 to 17 (inherited from parent POM).
* Bump org.apache:apache from 35 to 37 #306.
* Bump org.mockito:mockito-core from 5.15.2 to 5.23.0 #307, #333.
* Bump spring.version from 4.0.1 to 4.0.5 #308, #316, #325, #327.
* Bump org.apache.maven.plugins:maven-compiler-plugin from 3.14.1 to 3.15.0 #314.
* Bump jetty.version from 12.1.5 to 12.1.8 #312, #319, #335.
* Bump org.eclipse.jgit:org.eclipse.jgit from 7.5.0.202512021534-r to 7.6.0.202603022253-r #329.
* Bump org.apache.felix:maven-bundle-plugin from 6.0.0 to 6.0.2 #322.
* Bump org.apache.httpcomponents.client5:httpclient5 from 5.5.2 to 5.6 #332.
* Bump com.squareup.okhttp3:okhttp-jvm from 5.2.0 to 5.3.2 #331.
* JsonSerializer and JsonParser now strictly enforce RFC 8259 JSON (double quotes only).
Single-quoted JSON is rejected by JsonParser. Use Json5Serializer and Json5Parser for
JSON5 syntax (single quotes, trailing commas, comments, etc.).
* JsonSerializer.json5() and JsonParser.Strict have been removed. Use Json5Serializer
and Json5Parser directly for JSON5 support.
* BeanContext.beanToStringSerializer now uses Json5Serializer for toString() output
(more human-readable with single quotes).
* ComboRoundTripTest framework now distinguishes json vs json5; use json()/json5()
builder methods on ComboRoundTrip_Tester accordingly.
* juneau-examples-rest-jetty-ftest: SamplesMicroservice and RootResourcesTest now use
Json5Parser to match server output (RootResources uses quoteChar="'" for testing).
** New Features - Direct Iterator/Iterable/Stream/Enumeration Serialization
* Iterators, Iterables (non-Collection), Enumerations, and java.util.stream.Streams
are now serialized directly as arrays without requiring intermediate List materialization.
* Text-based serializers (JSON, XML, UON, URL Encoding, OpenAPI) write elements lazily
to the output one at a time via forEachStreamableEntry().
* Binary/layout-dependent serializers (MsgPack, HTML, CSV) collect to a List internally
since the format requires knowing the size or inspecting elements upfront.
* New ClassMeta methods: isIterator(), isIterable(), isStream(), isStreamable().
* New ClassMeta.Category enum values: ITERATOR, ITERABLE, STREAM.
* New SerializerSession methods: forEachStreamableEntry(), toListFromStreamable().
* IteratorSwap and EnumerationSwap classes have been removed; Iterator, Enumeration, Iterable,
and Stream types are now handled natively by all serializers.
** New Features - Built-in Date/Time and Duration Serialization
* Date, time, and duration types are now serialized and parsed natively as ISO 8601
strings by all serializers and parsers without requiring ObjectSwap registration.
* Supported types:
- All java.time.temporal.Temporal subtypes (Instant, ZonedDateTime, OffsetDateTime,
LocalDateTime, LocalDate, LocalTime, OffsetTime, Year, YearMonth)
- java.util.Calendar and java.util.Date
- javax.xml.datatype.XMLGregorianCalendar
- java.time.Duration (serialized as ISO 8601 duration strings, e.g. "PT1H30M")
* New ClassMeta.Category enum value: DURATION.
* New ClassMeta method: isDuration().
* New utility class: Iso8601Utils - centralizes ISO 8601 formatting and parsing.
* Default date/time swaps removed from DefaultSwaps; existing swap classes
(TemporalCalendarSwap, TemporalDateSwap, CalendarSwap, DateSwap, TemporalSwap)
remain available as override mechanisms for customizing output format.
* BeanSession.convertToMemberType() and SerializerSession.toString() updated to
use ISO 8601 formatting for date/time/Duration types.
* All parser sessions updated with date/time/Duration dispatch in parseAnything().
** New Features - Converter Framework (juneau-commons)
* New org.apache.juneau.commons.conversion package providing a lightweight, BeanContext-free
type conversion framework:
* Converter interface:
- canConvert(Class<?> inType, Class<?> outType) - default returns true; override to restrict.
- to(Object o, Class<T> type) - converts o to the target class; throws InvalidConversionException
if no conversion path exists; returns null only when input is null.
- to(Object o, Type mainType, Type... args) - parameterized-type variant for generic targets
such as List<String> or Map<String,Integer>.
* CachingConverter abstract class:
- Abstract base class implementing Converter with two-level ConcurrentHashMap cache.
- Conversion functions are discovered once via findConversion(Class, Class) and cached for
all subsequent calls on the same type pair.
- Unconvertable type pairs are also cached (via a NO_CONVERSION sentinel) to avoid repeated
reflection overhead.
- Subclasses implement findConversion(Class<I>, Class<O>) and return a Conversion<I,O> lambda,
or null if no conversion is possible for that type pair.
* BasicConverter class:
- Concrete CachingConverter with a thread-safe BasicConverter.INSTANCE singleton.
- Supports a wide range of common conversions without requiring BeanContext/BeanSession:
- Identity / widening cast (any type to same or supertype).
- Numeric narrowing/widening: Number to Integer, Long, Short, Float, Double, Byte,
AtomicInteger, AtomicLong, and primitive equivalents.
- Boolean to Number (true=1, false=0) and Number to Boolean (intValue() != 0).
- CharSequence to Number (parsed via StringUtils.parseNumber()).
- CharSequence (length 1) or Number to Character.
- Any type to String (toString() with array support via Arrays.toString()).
- CharSequence to Enum (Enum.valueOf()).
- Collection/array to Collection subtype (copies elements; element type from args[0]).
- Map to Map subtype (copies entries; key/value types from args[0]/args[1]).
- Collection/array to array (element type from outType.getComponentType()).
- Special cases: String ↔ TimeZone, String ↔ Locale.
- Reflection-based static factory lookup:
fromString/valueOf/of/from/parse/create/forName/fromValue/builder(X)
or dynamic fromX/forX/parseX where X is the input class name.
- Reflection-based constructor lookup: public T(X) constructor.
- Instance toX() method lookup (e.g. toInteger()).
* Conversion functional interface:
- O to(I in, Class<?>... args) - used as the cached conversion lambda in CachingConverter.
- args carries type arguments for parameterized output types at call time.
* InvalidConversionException runtime exception:
- Thrown by Converter.to() when no conversion path exists between two types.
- Message format: "Cannot convert <inType> to <outType>".
- Callers can pre-check with canConvert() to avoid the exception.
* BeanContextConverter (renamed from GenericConverter) in org.apache.juneau.utils:
- Implements Converter and delegates to the default BeanContext session for type conversion.
- Provides access to the full Juneau framework conversion logic including bean mapping.
** New Features - Large-Dataset Streaming APIs (BeanSupplier / BeanConsumer / BeanChannel)
* New streaming interfaces for serializing and parsing large datasets without loading all elements
into memory, enabling direct database integration (JDBC inserts/cursors, batch commits, rollbacks).
* BeanSupplier<T> (juneau-commons) - serializer-side lifecycle interface:
- Extends Iterable<T>; serializer calls begin(), iterates, calls onError(Exception) on error,
and always calls complete() in a finally block for resource cleanup (cursors, connections).
- Default onError() rethrows; override to add rollback or logging logic.
* BeanConsumer<T> (juneau-commons) - parser-side lifecycle interface:
- Extends ThrowingConsumer<T>; parser calls begin(), acceptThrows(T) per element,
onError(Exception) on element failure, and always calls complete() for resource cleanup.
- Default onError() rethrows (stop-on-error); override to absorb the exception and continue
parsing remaining elements (skip-and-continue / fault-tolerant ingestion).
* BeanChannel<T> (juneau-commons) - round-trip interface that extends both BeanSupplier and
BeanConsumer, allowing the same property to be used for both serialization and parsing.
* ListBeanChannel<T> (juneau-commons) - built-in in-memory implementation of BeanChannel backed
by an ArrayList; useful for testing and simple scenarios without a DI framework.
* ParserSession.parseToBeanConsumer(Object, BeanConsumer<T>, Class<T>) - new top-level API for
streaming parsing; drives the full consumer lifecycle. The default implementation parses to a
List first; format-specific parsers may override doParseToBeanConsumer() for true streaming.
* Supplier<T> unwrapping in SerializerSession - serializers now recursively unwrap nested
Supplier chains (up to depth 10) to their underlying value before serialization. BeanSupplier
instances are NOT unwrapped (they are treated as Iterable sequences).
* Direction validation - serializers throw SerializeException if a BeanConsumer (not BeanChannel)
is passed as a source; parsers throw ParseException if a BeanSupplier (not BeanChannel) is the
parse target. Error messages guide users toward the correct interface.
* @Bean(factory=X.class) - new annotation attribute specifying a BeanFactory class for
class-level factory-based instantiation; integrates with BeanStore (e.g. SpringBeanStore) for
DI framework support.
* @Beanp(factory=X.class) - new annotation attribute specifying a BeanFactory for a specific
bean property's value; enables property-level DI-managed streaming implementations.
* @Beanp(elementType=Y.class) - new annotation attribute declaring the element type for generic
streaming properties (Stream<Y>, BeanSupplier<Y>, BeanConsumer<Y>, BeanChannel<Y>); overcomes
Java type erasure. Also supports narrowing to concrete implementation types.
* BeanFactory<T> (juneau-commons) - universal @FunctionalInterface for creating instances of any
type T; BeanFactory.Void is a sentinel class for annotation defaults.
* BeanContext.Builder.beanStore(BeanStore) - new builder method for injecting a BeanStore (e.g.
SpringBeanStore) for factory resolution during bean creation.
Release Notes - Juneau - Version 9.2.0 - 2025-12-30
** Changes
* Bump org.springframework.boot:spring-boot-maven-plugin from 3.4.5 to 4.0.1 #218, #224, #232, #278, #298.
* Bump org.springframework.boot:spring-boot-starter-web from 3.4.5 to 4.0.1 #217, #225, #239, #260, #277, #288, #298.
* Bump org.apache:apache from 34 to 35 #220.
* Bump org.eclipse.jgit:org.eclipse.jgit from 7.2.1.202505142326-r to 7.5.0.202512021534-r #221, #296.
* Bump jetty.version from 12.0.21 to 12.1.5 #222, #228, #229, #275, #294.
* Bump org.junit.vintage:junit-vintage-engine from 5.12.2 to 6.0.1 #223, #257, #280.
* Bump junit-jupiter from 5.13.4 to 6.0.1.
* Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.11.2 to 3.12.0 #237m #255.
* Annotations associated with a subclass of org.apache.juneau.annotation.AnnotationBuilder that didn't carry an `String[] description()` attribute now do.
For example: org.apache.juneau.http.annotation.Path.
The current use case is for developers to further annotate their code with documentation.
* Bump org.apache.maven.plugins:maven-compiler-plugin from 3.14.0 to 3.14.1 #271.
* Bump org.jacoco:jacoco-maven-plugin from 0.8.13 to 0.8.14 #273.
* Bump js-yaml from 3.14.1 to 3.14.2 in /juneau-docs #282.
* Bump node-forge from 1.3.1 to 1.3.2 in /juneau-docs #283, fixes CVE-2025-12816.
* Bump mdast-util-to-hast from 13.2.0 to 13.2.1 in /juneau-docs #286, fixes Dependabot alerts #17 mdast-util-to-hast has unsanitized class attribute.
* Bump org.apache.maven.plugins:maven-shade-plugin from 3.5.1 to 3.6.1 #284.
* Bump express from 4.21.2 to 4.22.1 in /juneau-docs #287
Security fix for CVE-2024-51999 (GHSA-pj86-cfqh-vqx6).
* Bump org.codehaus.mojo:exec-maven-plugin from 3.6.2 to 3.6.3 #301.
* Bump org.apache.maven.plugins:maven-source-plugin from 3.2.1 to 3.4.0 #290.
** New Features - Multi-Key Cache and Concurrent Map Classes
* Renamed multi-key concurrent map classes for better consistency:
- Concurrent2KeyHashMap -> ConcurrentHashMap2Key
- Concurrent3KeyHashMap -> ConcurrentHashMap3Key
- Concurrent4KeyHashMap -> ConcurrentHashMap4Key
- Concurrent5KeyHashMap -> ConcurrentHashMap5Key
* Refactored ConcurrentHashMapXKey classes to remove caching functionality:
- Removed 'disabled' and 'supplier' parameters from constructors
- Now pure multi-key concurrent hash maps extending ConcurrentHashMap
- Added null key validation (throws IllegalArgumentException for null keys)
- Simplified get() and put() methods to use Tuple classes directly
* New Cache classes extending ConcurrentHashMap for single-key caching:
- Cache extends ConcurrentHashMap<K,V>
- Provides builder pattern with configurable options
- Features: disableCaching, maxSize, logOnExit, default supplier
- Support for both default supplier and per-call supplier override
- Built-in cache hit tracking via getCacheHits()
- Automatic cache eviction when maxSize is exceeded
* New multi-key Cache classes for composite key caching:
- Cache2<K1,K2,V> extends ConcurrentHashMap2Key<K1,K2,V>
- Cache3<K1,K2,K3,V> extends ConcurrentHashMap3Key<K1,K2,K3,V>
- Cache4<K1,K2,K3,K4,V> extends ConcurrentHashMap4Key<K1,K2,K3,K4,V>
- Cache5<K1,K2,K3,K4,K5,V> extends ConcurrentHashMap5Key<K1,K2,K3,K4,K5,V>
- Each supports builder pattern with same features as Cache
- Default suppliers use FunctionX interfaces (Function2, Function3, etc.)
- Null key validation for all key components
* Example usage:
Cache2<ClassLoader,Class<?>,ClassMeta> metaCache = Cache2
.of(ClassLoader.class, Class.class, ClassMeta.class)
.maxSize(500)
.supplier((cl, clazz) -> computeMeta(cl, clazz))
.build();
ClassMeta meta = metaCache.get(classLoader, MyClass.class);
* Migration notes:
- Code using Concurrent2KeyHashMap with disabled/supplier should migrate to Cache2
- Code using ConcurrentXKeyHashMap without caching features requires no changes
- Null keys are no longer allowed (previously bypassed cache, now throws exception)
Release Notes - Juneau - Version 9.1.0 - 2025-06-10
** Changes
* Bump Java platform requirement from Java 11 to 17.
* [JUNEAU-253] - Bump springboot.version from 3.2.2 to 3.4.4.
* [JUNEAU-254] - Bump jetty.version from 11.0.16 to 11.0.21, #207, #208.
* [JUNEAU-255] - Bump org.apache:apache from 29 to 31.
* [JUNEAU-256] - Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.5.0 to 3.10.1
* [JUNEAU-257] - Bump maven-bundle-plugin from 5.1.8 to 5.1.9.
* [JUNEAU-258] - Bump maven-jxr-plugin from 3.3.0 to 3.5.0.
* [JUNEAU-259] - Bump from Junit 4.13.2 to JUnit 5.12.0 Vintage Engine.
* [JUNEAU-260] - Bump maven-surefire-report-plugin from 2.22.2 to 3.1.2.
* [JUNEAU-261] - Bump org.apache.derby:derby from 10.16.1.1 to 10.17.1.0 #118.
* [JUNEAU-263] - Remove Google Analytics from the Juneau Website.
* [JUNEAU-262] Port Jetty from 11.0.20 to 12.0.20 #148, #156, #160, #165, #169, #175, #183, #201.
* [JUNEAU-252] Bump org.eclipse.jgit:org.eclipse.jgit from 6.6.1.202309021850-r to 7.2.1.202505142326-r #112, #123, #137, #152, #166, #184, #191, #209.
* [JUNEAU-253] Bump springboot.version from 3.1.3 to 3.4.5 #136, #138, #142, #146, #153, #158, #162, #167, #172, #177, #186, #187, #188, #193, #198.
* [JUNEAU-254] Bump jetty.version from 11.0.16 to 11.0.20.
* [JUNEAU-255] Bump org.apache:apache from 29 to 34 #143, #202.
* [JUNEAU-256] Bump maven-javadoc-plugin from 3.5.0 to 3.11.2 #149, #159, #164, #170, #181.
* [JUNEAU-257] Bump maven-bundle-plugin from 5.1.8 to 5.1.9 to 6.0.0 #178.
* [JUNEAU-258] Bump maven-jxr-plugin from 3.3.0 to 3.6.0 #150, #163, #174.
* [JUNEAU-259] Bump from Junit 4.13.2 to JUnit 5.12.2 Vintage Engine #189, #197.
* [JUNEAU-260] Bump maven-surefire-report-plugin from 2.22.2 to 3.1.2.
* [JUNEAU-261] Bump org.apache.derby:derby from 10.16.1.1 to 10.17.1.0.
* Project requires minimum Maven version for build of 3.6.3.
* Bump org.apache.maven.plugins:maven-compiler-plugin from 3.11.0 to 3.14.0 #139, #190.
* Bump org.apache.maven.plugins:maven-shade-plugin from 3.4.1 to 3.6.0 #135, #144, #147.
* Bump org.jacoco:jacoco-maven-plugin from 0.8.11 to 0.8.13 #140, 204.
* Bump org.apache.maven.plugins:maven-source-plugin from 3.2.1 to 3.3.1 #141.
* Bump jakarta.servlet:jakarta.servlet-api 6.1.0 from 6.0.0 to 6.1.0.
* Bump org.apache:apache from 32 to 33 #157.
* Add org.apache.juneau.rest.mock.MockServletResponse.sendRedirect(String, int, boolean) for jakarta.servlet:jakarta.servlet-api 6.1.0.
* Bump org.junit:junit-bom from 5.10.3 to 5.11.4 #161, #168, #171, #173, #185.
* Flip console output logic on shutdown from a system property called 'SystemUtils.quiet' to 'SystemUtils.verbose'.
* org.apache.juneau.microservice.jetty.JettyMicroservice.Builder.jettyXml(Object, boolean) now handles java.nio.file.Path.
* Add org.apache.juneau.common.internal.PathReaderBuilder
* Add org.apache.juneau.common.internal.IOUtils.read(Path)
* org.apache.juneau.microservice.Microservice.Builder.manifest(Object) now handles java.nio.file.Path.
Release Notes - Juneau - Version 9.0.1 - 2023-09-06
** Improvement
* [JUNEAU-243] Bump jetty.version from 11.0.13 to 11.0.16.
* [JUNEAU-244] Bump springboot.version from 3.0.1 to 3.1.3 #97, #102, #104, #106.
* [JUNEAU-245] Bump hibernate.version from 5.6.14.Final to 5.6.15.Final #95.
* [JUNEAU-246] Bump org.eclipse.jgit from 6.4.0.202211300538-r to 6.6.1.202309021850-r #101, #105, #110.
* [JUNEAU-250] Bump org.codehaus.groovy:groovy from 3.0.18 to 3.0.19 #145.
Release Notes - Juneau - Version 9.0.0 - 2023-01-07
** Placeholder
Release Notes - Juneau - Version 9.0-B1 - 2022-06-23
** Placeholder
Release Notes - Juneau - Version 8.2.0 - 2020-10-01
** Bug
* [JUNEAU-168] - Serializer/Parser handling of proxy beans.
* [JUNEAU-184] - HtmlSerializer doesn't property serialize Collection<A> objects.
* [JUNEAU-187] - HtmlSerializer does not honor @Bean(bpi) on collections of beans with null values in first row.
* [JUNEAU-189] - @ReestMethod(debug="true") does not appear to cause HTTP requests to be logged.
* [JUNEAU-195] - @Beanp("*") not working correctly?
* [JUNEAU-196] - @Html(noTableHeaders) should work on Collections of beans.
* [JUNEAU-197] - @BeanConfig(bpi) does not override @Bean(bpi)
* [JUNEAU-201] - JettyMicroserviceBuilder logConfig method is a NO-OP
* [JUNEAU-216] - BEANTRAVERSE_initialDepth not setting indentation correctly on first line.
* [JUNEAU-232] - BEAN_isIgnoreUnknownNullBeanProperties doesn't always work correctly.
* [JUNEAU-233] - JsonParser is not instantiating interface proxies.
* [JUNEAU-234] - BEAN_ignoreInvocationExceptionsOnGetters is not working.
** New Feature
* [JUNEAU-242] - Framework should recognize "withX" fluent setters.
** Improvement
* [JUNEAU-180] - Incorrect Swagger on Spring Boot methods that return Collections of beans.
* [JUNEAU-181] - JuneauRestInitializer needs a no-arg constructor.
* [JUNEAU-182] - Add a RestCallHandler interface to the RestClient API
* [JUNEAU-183] - Remote methods should support Future return types.
* [JUNEAU-185] - ResourceDescriptions needs an append(url, label, description) method.
* [JUNEAU-186] - REST classes should allow themselves to implement helper classes.
* [JUNEAU-188] - @Bean annotation should override class visibility rules.
* [JUNEAU-190] - Need ability to define actions for unauthorized requests via the @Rest(roleGuard).
* [JUNEAU-191] - <aside> elements in HtmlDocSerializer should allow to float left/right/top/bottom instead of just right.
* [JUNEAU-192] - HtmlElement beans should have convenience constructors or creators.
* [JUNEAU-193] - RestClient should support all languages by default.
* [JUNEAU-194] - Provide a simple Hyperlink bean.
* [JUNEAU-198] - Need improved ability to turn on debug in REST via environment variables.
* [JUNEAU-199] - New ContentDisposition header bean.
* [JUNEAU-200] - StreamResource/ReaderResource classes should take in HttpHeader beans.
* [JUNEAU-202] - Add option for ignoring @Transient properties during marshalling.
* [JUNEAU-203] - Bean copy constructor can be confused with builder constructor.
* [JUNEAU-204] - Add @RestMethod(paths) to allow matching multiple paths.
* [JUNEAU-205] - Add @Path(required=boolean) annotation to allow path variables to be optionally matched.
* [JUNEAU-208] - Version 7.2.2 is missing from https://juneau.apache.org/#whatsnew.html
* [JUNEAU-227] - BEAN_methodVisibility and BEAN_constructorVisibility doesn't affect swap methods.
* [JUNEAU-228] - Make it easier to create bean filters programmatically.
* [JUNEAU-235] - New BeanInterceptor API for intercepting calls to getters/setters.
* [JUNEAU-236] - BEAN_addRootType doesn't work without BEAN_addBeanTypes
* [JUNEAU-240] - RestContext should be subclassible.
Release Notes - Juneau - Version 8.1.5 - 2025-05-13
** Placeholder
Release Notes - Juneau - Version 8.1.4 - 2024-10-16
** Placeholder
Release Notes - Juneau - Version 8.1.3 - 2020-01-13
** Bug
* [JUNEAU-169] - Dynamic annotations.
* [JUNEAU-170] - @RestMethod(name="*") doesn't always work.
* [JUNEAU-172] - @RestResource(debug=true) doesn't work if REST method not matched.
* [JUNEAU-173] - Undeprecate HttpClientBuilder convenience methods in RestClientBuilder.
* [JUNEAU-174] - Allow configuration properties to be set globally using system properties or env vars.
* [JUNEAU-176] - Race condition when parsing into array types.
** New Feature
* [JUNEAU-175] - Execution statistics for REST methods.
** Improvement
* [JUNEAU-154] - [PetStore] Add mock testing.
* [JUNEAU-177] - Allow REST methods at specific paths to be overridden by methods in child classes.
Release Notes - Juneau - Version 8.1.2 - 2019-11-25
** Bug
* [JUNEAU-156] - Test Fails on ko_KR Locale.
* [JUNEAU-158] - The KEYS link should have KEYS as the text
* [JUNEAU-160] - Setting bean properties of type list don't use setters.
* [JUNEAU-161] - Exeption-Message header can contain CR/LF characters.
* [JUNEAU-162] - RestClient class should be extensible.
* [JUNEAU-163] - Request Exception-Message response header should be truncated to some reasonable value.
* [JUNEAU-164] - Stacktrace hashing should take proxies and lamba expressions into account.
** Improvement
* [JUNEAU-155] - Split bpi/bpx into serializer and parser configuration properties.
** Task
* [JUNEAU-159] - Package pet store application in jar format.
Release Notes - Juneau - Version 8.1.1 - 2019-09-15
** Bug
* [JUNEAU-143] - Static files mapping doesn't properly handle override scenarios.
* [JUNEAU-147] - Error in Swagger generator when @Example used on bean class.
** Improvement
* [JUNEAU-144] - Add support for absolute paths on @RestResource(staticFiles)
* [JUNEAU-145] - @RestResource(staticFiles) should handle multiple mappings.
* [JUNEAU-146] - Add ranks to @Config annotations.
** Task
* [JUNEAU-132] - Various HTTP parameter annotations should support Optional.
* [JUNEAU-133] - Serializers/parsers should support Optional objects and properties.
* [JUNEAU-134] - Parsers not correctly finding generic types on complex types involving arrays.
* [JUNEAU-135] - @RestMethod(debug=true) is not causing requests to be logged.
* [JUNEAU-136] - Juneau cannot reflect parameterized types on Spring bean methods.
* [JUNEAU-137] - Juneau cannot reflect parameterized types on Spring bean methods.
* [JUNEAU-138] - Move REST response/exception beans into juneau-marshall.
* [JUNEAU-139] - juneau-rest-client should not have dependency on juneau-rest-server.
* [JUNEAU-140] - Provide initial contents of PetStore modules.
* [JUNEAU-141] - Move @RemoteResource/@RemoteMethod annotations into juneau-marshall.
* [JUNEAU-142] - BasicRest subclasses need programmatic access to RestRequest/RestResponse
Release Notes - Juneau - Version 8.1.0 - 2019-08-10
** Bug
* [JUNEAU-29] - Replace @BeanConstructor with @BeanParameter annotations.
* [JUNEAU-94] - Fix build warnings on Java 11
* [JUNEAU-105] - UrlPathPattern should use a state machine.
* [JUNEAU-107] - IllegalArgumentException in DefaultHandler.handle()
* [JUNEAU-124] - Serializers and parsers should throw specific exceptions.
* [JUNEAU-129] - LocalizedDatesTest failures during build
** New Feature
* [JUNEAU-96] - Add Automatic-Module-Name metadata
* [JUNEAU-98] - Add @RestMethod(allowMethodParam/allowMethodHead) annotations
* [JUNEAU-99] - @RestMethod(roleGuard="xxx") annotation.
* [JUNEAU-100] - REST_allowedMethodHeaders / @RestResource(allowedMethodHeaders) / @RestMethod(allowedMethodHeaders)
* [JUNEAU-101] - Update handling of dates to use new Java 8 libraries.
* [JUNEAU-102] - Expanded REST annotations
* [JUNEAU-103] - Add POJO diff tool
* [JUNEAU-104] - Support for using named method parameters.
** Improvement
* [JUNEAU-50] - Publish a contributors guide
* [JUNEAU-56] - Build microservices with Maven
* [JUNEAU-93] - Use constructor argument names as bean property names.
* [JUNEAU-97] - Path Parameter in Parent RestResource
* [JUNEAU-106] - Improved REST debugging.
* [JUNEAU-108] - AccessDeniedException should cause HTTP 401 response.
* [JUNEAU-109] - BasicRestLogger should take in Servlet class so that logging can be based on that class.
** Task
* [JUNEAU-126] - Serializers should serialize Iterators and Enumerations by default.
* [JUNEAU-127] - Clean up usage of PojoSwaps in ClassMeta
* [JUNEAU-128] - Code improvements around DynamicSwaps
Release Notes - Juneau - Version 8.0.0 - 2018-12-23
** Improvement
* [JUNEAU-91] - Update Jetty to jetty-9.4.13.v20181111
Release Notes - Juneau - Version 7.2.2 - 2018-11-07
** Bug
* [JUNEAU-88] - AddressBookResourceTest fails with org.apache.juneau.rest.client.RestCallException: Software caused connection abort: recv failed
* [JUNEAU-89] - errors in juneau-examples-rest
* [JUNEAU-90] - Could not instantiate class org.apache.juneau.svl.Var
Release Notes - Juneau - Version 7.2.1 - 2018-10-23
** Bug
* [JUNEAU-85] - Don't break compatibility with 7.1.0
* [JUNEAU-86] - Avoid NPE stopping RestMicroservice
* [JUNEAU-87] - Tests should not use hard-wired line-endings.
Release Notes - Juneau - Version 7.2.0 - 2018-09-17
** Bug
* [JUNEAU-83] - Cannot subclass RestClient and RestClientBuilder
* [JUNEAU-82] - Config and Logs resource pages should have configurable look-and-feel.
** New Feature
* [JUNEAU-60] - @RestMethod parameter annotation to populate a POJO using RequestBean format
** Improvement
* [JUNEAU-81] - Update Jetty to 9.4.9
* [JUNEAU-84] - Upgrade to Jetty 9.4.12
Release Notes - Juneau - Version 7.1.0 - 2018-03-02
** Bug
* [JUNEAU-75] - Documentation not clear on how to customize htdocs folder
* [JUNEAU-78] - Is org.apache.juneau.dto.swagger.SchemaInfo missing a $ref field?
* [JUNEAU-79] - org.apache.juneau.microservice.RestMicroservice.stop() should not dump stack traces on the console
* [JUNEAU-80] - RestCallHandlerDefault service method calls handleResponse which seems to close output stream right before it runs res.flushbuffer which throws an IO exception because the stream is closed.
** Improvement
* [JUNEAU-76] - Improvements to Context/Builder APIs
* [JUNEAU-77] - Document how to customize the favicon
Release Notes - Juneau - Version 7.0.1 - 2017-12-18
** Bug
* [JUNEAU-68] - Add BoundedReader to REST input
* [JUNEAU-69] - XML parser should ignore comments.
* [JUNEAU-71] - No git tag for release 7.0.0
** Improvement
* [JUNEAU-72] - Offer an option to disable console IO from org.apache.juneau.microservice.Microservice.start()
* [JUNEAU-73] - Update Jetty from 9.4.7.v20170914 to 9.4.8.v20171121
* [JUNEAU-74] - Update Apache HttpClient from 4.5.3 to 4.5.4
Release Notes - Juneau - Version 7.0.0 - 2017-10-22
** Improvement
** New Feature
Release Notes - Juneau - Version 6.4.0
** Improvement
* [JUNEAU-46] - Remove references to wink
* [JUNEAU-64] - Support advanced annotated variables on methods implementing onPreCall and onPostCall
** New Feature
* [JUNEAU-62] - Support complete customization of jetty runtime
* [JUNEAU-65] - utility for merging two like POJOs
Release Notes - Juneau - Version 6.3.1
** Bug
* [JUNEAU-59] - Fix "Copyright (c) 2016, Apache Foundation" year in documentation.
** Improvement
* [JUNEAU-58] - Embed HTML in @HtmlDoc.description
Release Notes - Juneau - Version 6.3.0
** Bug
* [JUNEAU-38] - Testcase failure in UK
* [JUNEAU-45] - Rebrand web pages with new incubator logo.
* [JUNEAU-47] - Fix RAT check failure with logs generated during build
* [JUNEAU-51] - properties added to rest client, serializer, and parser are not available during POJO swap and unswap methods
** Improvement
* [JUNEAU-57] - seamless serialization and parsing of string fields to/from enum
Release Notes - Juneau - Version 6.2.0
** Bug
* [JUNEAU-37] - REST Testcases can fail with ports 10000. 10001 in use.
* [JUNEAU-39] - Add "Incubator" to NOTICE file.
** Improvement
* [JUNEAU-32] - Improvements to BeanMeta class
* [JUNEAU-41] - Prerequisites usage is deprecated for non Maven-plugin projects
* [JUNEAU-42] - More powerful RetryOn interface
* [JUNEAU-43] - Removed superfluous property encoding
* [JUNEAU-44] - Simplify the configuration for apache-rat-plugin
Release Notes - Juneau - Version 6.1.0
** Bug
* [JUNEAU-25] - Minor release issues in 6.0.1 RC3
* [JUNEAU-28] - Separate out RDF-code into separate juneau.core.rdf project.
** Improvement
* [JUNEAU-26] - Add support for date localization.
* [JUNEAU-27] - Rename projects.
* [JUNEAU-31] - Separate out JAX-RS support from server/rest component
* [JUNEAU-34] - Remove <string> tags from HTML serialization.
* [JUNEAU-35] - Add StringSwap and MapSwap convenience classes.
* [JUNEAU-36] - Examples improvements
** New Feature
* [JUNEAU-33] - HTML5 DOM objects.
Release Notes - Juneau - Version 6.0.1
** Bug
* [JUNEAU-17] - Resolve various small issues pointed out during release of 6.0.0
* [JUNEAU-19] - Fix various JSON parser edge cases
* [JUNEAU-21] - Scrub references to IBM from code.
* [JUNEAU-22] - Localization bugs in CalendarSwap JUnits
* [JUNEAU-23] - Fix various Maven build warnings.
* [JUNEAU-24] - Fix release issues discovered by Stian
** Improvement
* [JUNEAU-18] - Add HtmlDocSerializer.DEFAULT field.
** Task
* [JUNEAU-20] - Remove references to ibm.com from website
Release Notes - Juneau - Version 6.0.0
** Bug
* [JUNEAU-1] - Cannot run org.apache.juneau.samples unit tests.
* [JUNEAU-2] - org.apache.juneau.jena.CT_Rdf.testLooseCollectionsOfBeans()
* [JUNEAU-4] - Test case failure: CT_Visibility.testClassDefault
** Improvement
* [JUNEAU-13] - Rename PojoTransform to PojoSwap
** Task
* [JUNEAU-5] - Update root README.md file.
* [JUNEAU-6] - Complete work on Juneau website (http://juneau.incubator.apache.org/)
* [JUNEAU-7] - Complete work on setting up Confluence workspace (https://cwiki.apache.org/confluence/display/JUNEAU/Juneau+Home)
* [JUNEAU-8] - Update contents of incubator status page (http://incubator.apache.org/projects/juneau.html)
* [JUNEAU-9] - Set up Jenkins builds for Juneau artifacts.
* [JUNEAU-10] - Figure out hosting options for generated Javadocs.
* [JUNEAU-11] - Create root pom.xml
* [JUNEAU-12] - Add Maven instructions to Dev setup guide.
* [JUNEAU-14] - Add SerializerGroup and ParserGroup info to web site about page.