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