<!--
/***************************************************************************************************************************
 * 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.
 ***************************************************************************************************************************/
 -->

8.1.3 (TBD)

<p>
	Juneau 8.1.3 is a minor release.
</p>

<h5 class='topic w800'>juneau-marshall</h5>
<ul class='spaced-list'>
	<li>
		Better representation of nulls for XML and HTML content properties.
		<br>Old:  <js>"&lt;myBean&gt;&lt;null&gt;&lt;/myBean&gt;"</js>
		<br>New:  <js>"&lt;myBean nil='true'&gt;&lt;/myBean&gt;"</js>
	<li>
		Configurable properties such as {@link oaj.BeanContext#BEAN_debug} can now be set globally by either
		system properties or environment variables.
		<br>For <jsf>BEAN_debug</jsf> which resolves to <js>"BEAN_debug"</js>, you can use either the system
		property <js>"BeanContext.debug.b"</js> or environment variables <js>"BeanContext_debug_b"</js> or 
		<js>"BEANCONTEXT_DEBUG_B"</js>.
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li> 
		Fixed bug in {@link oajr.BasicRestCallHandler} where if you have the following REST methods...
		<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/foo"</js>)
	<ja>@RestMethod</ja>(name=<js>"*"</js>, path=<js>"/bar"</js>)
		</p>
		...and you tried to make a GET request to /bar, you'd erroneously get a 404 error instead of matching the 2nd method.
	<li> 
		Fixed an issue involving using Juneau REST with Spring Security.  When Spring Security cannot authenticate a 
		request, it sets the URL on the request to <js>"/error"</js> with a 401 status.  When Juneau then processes
		this request, it cannot find that mapping and changes the status to 404 which messes with HTTP clients.
		<br>Solution was to add a default no-op error method to the {@link oajr.BasicRestConfig} (and implementers):
		<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"*"</js>, path=<js>"/error"</js>)
	<jk>public void</jk> error() {}
		</p>
	<li>
		Fixed a bug where <c><ja>@RestResource</ja>(debug=<js>"true"</js>)</c> wouldn't log requests if a 
		<ja>@RestMethod</ja>-annotated method was not matched.
	<li>
		Renamed the following annotations:
		<ul>
			<li><ja>@Rest(attrs)</ja> --&gt; {@link oajr.annotation.Rest#reqAttrs() @Rest(reqAttrs)}
			<li><ja>@Rest(defaultRequestHeaders)</ja> --&gt; {@link oajr.annotation.Rest#reqHeaders() @Rest(reqHeaders)}
			<li><ja>@Rest(defaultResponseHeaders)</ja> --&gt; {@link oajr.annotation.Rest#resHeaders() @Rest(resHeaders)}
			<li><ja>@RestMethod(attrs)</ja> --&gt; {@link oajr.annotation.RestMethod#reqAttrs() @RestMethod(reqAttrs)}
			<li><ja>@RestMethod(defaultRequestHeaders)</ja> --&gt; {@link oajr.annotation.RestMethod#reqHeaders() @RestMethod(reqHeaders)}
		</ul>
	<li>
		New auto-generated REST method execution statistics: {@doc juneau-rest-server.ExecutionStatistics}
</ul>

<h5 class='topic w800'>juneau-rest-client</h5>
<ul class='spaced-list'>
	<li>
		Several convenience methods defined in {@link oajrc.RestClientBuilder} that were deprecated in 8.1.2 have been
		undeprecated in this release due to user feedback.
</ul>

<h5 class='topic w800'>juneau-doc</h5>
<ul class='spaced-list'>
	<li>
		New auto-generated glossary of all configurable properties: {@doc Glossaries.ConfigurablePropertiesGlossary}
</ul>
