<!--
/***************************************************************************************************************************
 * 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.2 (TBD)

<p>
	Juneau 8.1.2 is a minor release with mostly bug fixes.  Improvements around specifying bean properties have also been made.
</p>

<h5 class='topic w800'>juneau-marshall</h5>
<ul class='spaced-list'>
	<li>
		Support for read-only and write-only properties.
		<ul>
			<li class='ja'>{@link oaj.annotation.Bean#bpro()}
			<li class='ja'>{@link oaj.annotation.Bean#bpwo()}
			<li class='ja'>{@link oaj.annotation.Beanp#ro()}
			<li class='ja'>{@link oaj.annotation.Beanp#wo()}
			<li class='jf'>{@link oaj.BeanContext#BEAN_bpro}
			<li class='jf'>{@link oaj.BeanContext#BEAN_bpwo}
			<li class='jm'>{@link oaj.BeanContextBuilder#bpro(Map)}
			<li class='jm'>{@link oaj.BeanContextBuilder#bpwo(Map)}
		</ul>
	<li>
		New convenience methods:
		<ul>	
			<li class='jm'>{@link oaj.ObjectMap#parse(CharSequence)}
			<li class='jm'>{@link oaj.ObjectList#parse(CharSequence)}
		</ul>
	<li>
		{@link oaj.marshall.CharMarshall} and {@link oaj.marshall.StreamMarshall} now have public constructors.
	<li>
		{@link oaj.annotation.Beanp @Beanp} replaces {@link oaj.annotation.BeanProperty @BeanProperty} with shorter syntax.
	<li>
		Shortened names for {@link oaj.annotation.Bean#dictionary @Bean(dictionary)} and {@link oaj.BeanContextBuilder#dictionary(Class...)}.
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li>
		New method {@link oajr.RestResponse#setHeaderSafe(String,String)} to strip invalid characters from header values.
	<li>
		Fixed issues related to invalid characters being set on HTTP header values.
</ul>

<h5 class='topic w800'>juneau-rest-client</h5>
<ul class='spaced-list'>
	<li>
		{@link oajrc.RestClient} is now extendible.  The constructor has been made public and simplified to:
		{@link oajrc.RestClient#RestClient(RestClientBuilder)}.
	<li>
		Duplicate methods between {@link oajrc.RestClientBuilder} and {@link org.apache.http.impl.client.HttpClientBuilder}
		have been made deprecated on the former.  This eliminates the need to try to keep the two builder classes in
		sync.
</ul>
