| <!DOCTYPE HTML> |
| <html lang="en"> |
| <head> |
| <!-- Generated by javadoc (18) --> |
| <title>Source code</title> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <meta name="description" content="source: package: org.apache.juneau, class: BeanContext, class: Builder"> |
| <meta name="generator" content="javadoc/SourceToHTMLConverter"> |
| <link rel="stylesheet" type="text/css" href="../../../../javadoc.css" title="Style"> |
| </head> |
| <body class="source-page"> |
| <main role="main"> |
| <div class="source-container"> |
| <pre><span class="source-line-no">001</span><span id="line-1">// ***************************************************************************************************************************</span> |
| <span class="source-line-no">002</span><span id="line-2">// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *</span> |
| <span class="source-line-no">003</span><span id="line-3">// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *</span> |
| <span class="source-line-no">004</span><span id="line-4">// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *</span> |
| <span class="source-line-no">005</span><span id="line-5">// * with the License. You may obtain a copy of the License at *</span> |
| <span class="source-line-no">006</span><span id="line-6">// * *</span> |
| <span class="source-line-no">007</span><span id="line-7">// * http://www.apache.org/licenses/LICENSE-2.0 *</span> |
| <span class="source-line-no">008</span><span id="line-8">// * *</span> |
| <span class="source-line-no">009</span><span id="line-9">// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *</span> |
| <span class="source-line-no">010</span><span id="line-10">// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *</span> |
| <span class="source-line-no">011</span><span id="line-11">// * specific language governing permissions and limitations under the License. *</span> |
| <span class="source-line-no">012</span><span id="line-12">// ***************************************************************************************************************************</span> |
| <span class="source-line-no">013</span><span id="line-13">package org.apache.juneau;</span> |
| <span class="source-line-no">014</span><span id="line-14"></span> |
| <span class="source-line-no">015</span><span id="line-15">import static org.apache.juneau.Visibility.*;</span> |
| <span class="source-line-no">016</span><span id="line-16">import static org.apache.juneau.collections.JsonMap.*;</span> |
| <span class="source-line-no">017</span><span id="line-17">import static org.apache.juneau.common.internal.StringUtils.*;</span> |
| <span class="source-line-no">018</span><span id="line-18">import static org.apache.juneau.common.internal.ThrowableUtils.*;</span> |
| <span class="source-line-no">019</span><span id="line-19">import static org.apache.juneau.internal.ClassUtils.*;</span> |
| <span class="source-line-no">020</span><span id="line-20">import static org.apache.juneau.internal.CollectionUtils.*;</span> |
| <span class="source-line-no">021</span><span id="line-21"></span> |
| <span class="source-line-no">022</span><span id="line-22">import java.beans.*;</span> |
| <span class="source-line-no">023</span><span id="line-23">import java.io.*;</span> |
| <span class="source-line-no">024</span><span id="line-24">import java.lang.annotation.*;</span> |
| <span class="source-line-no">025</span><span id="line-25">import java.lang.reflect.*;</span> |
| <span class="source-line-no">026</span><span id="line-26">import java.util.*;</span> |
| <span class="source-line-no">027</span><span id="line-27">import java.util.concurrent.*;</span> |
| <span class="source-line-no">028</span><span id="line-28">import java.util.stream.*;</span> |
| <span class="source-line-no">029</span><span id="line-29"></span> |
| <span class="source-line-no">030</span><span id="line-30">import org.apache.juneau.annotation.*;</span> |
| <span class="source-line-no">031</span><span id="line-31">import org.apache.juneau.collections.*;</span> |
| <span class="source-line-no">032</span><span id="line-32">import org.apache.juneau.cp.*;</span> |
| <span class="source-line-no">033</span><span id="line-33">import org.apache.juneau.internal.*;</span> |
| <span class="source-line-no">034</span><span id="line-34">import org.apache.juneau.json.*;</span> |
| <span class="source-line-no">035</span><span id="line-35">import org.apache.juneau.marshaller.*;</span> |
| <span class="source-line-no">036</span><span id="line-36">import org.apache.juneau.reflect.*;</span> |
| <span class="source-line-no">037</span><span id="line-37">import org.apache.juneau.serializer.*;</span> |
| <span class="source-line-no">038</span><span id="line-38">import org.apache.juneau.swap.*;</span> |
| <span class="source-line-no">039</span><span id="line-39">import org.apache.juneau.utils.*;</span> |
| <span class="source-line-no">040</span><span id="line-40"></span> |
| <span class="source-line-no">041</span><span id="line-41">/**</span> |
| <span class="source-line-no">042</span><span id="line-42"> * Bean context.</span> |
| <span class="source-line-no">043</span><span id="line-43"> *</span> |
| <span class="source-line-no">044</span><span id="line-44"> * <p></span> |
| <span class="source-line-no">045</span><span id="line-45"> * This class servers multiple purposes:</span> |
| <span class="source-line-no">046</span><span id="line-46"> * <ul class='spaced-list'></span> |
| <span class="source-line-no">047</span><span id="line-47"> * <li></span> |
| <span class="source-line-no">048</span><span id="line-48"> * Provides the ability to wrap beans inside {@link Map} interfaces.</span> |
| <span class="source-line-no">049</span><span id="line-49"> * <li></span> |
| <span class="source-line-no">050</span><span id="line-50"> * Serves as a repository for metadata on POJOs, such as associated {@link Bean @Bean} annotations,</span> |
| <span class="source-line-no">051</span><span id="line-51"> * {@link PropertyNamer PropertyNamers}, etc... which are used to tailor how POJOs are serialized and parsed.</span> |
| <span class="source-line-no">052</span><span id="line-52"> * </ul></span> |
| <span class="source-line-no">053</span><span id="line-53"> *</span> |
| <span class="source-line-no">054</span><span id="line-54"> * <p></span> |
| <span class="source-line-no">055</span><span id="line-55"> * All serializers and parsers use this context so that they can handle POJOs using a common framework.</span> |
| <span class="source-line-no">056</span><span id="line-56"> *</span> |
| <span class="source-line-no">057</span><span id="line-57"> * <h5 class='topic'>Bean Contexts</h5></span> |
| <span class="source-line-no">058</span><span id="line-58"> *</span> |
| <span class="source-line-no">059</span><span id="line-59"> * <p></span> |
| <span class="source-line-no">060</span><span id="line-60"> * Bean contexts are created through the {@link BeanContext#create() BeanContext.create()} and {@link Builder#build()} methods.</span> |
| <span class="source-line-no">061</span><span id="line-61"> * <br>These context objects are read-only, reusable, and thread-safe.</span> |
| <span class="source-line-no">062</span><span id="line-62"> *</span> |
| <span class="source-line-no">063</span><span id="line-63"> * <p></span> |
| <span class="source-line-no">064</span><span id="line-64"> * Each bean context maintains a cache of {@link ClassMeta} objects that describe information about classes encountered.</span> |
| <span class="source-line-no">065</span><span id="line-65"> * These <c>ClassMeta</c> objects are time-consuming to construct.</span> |
| <span class="source-line-no">066</span><span id="line-66"> * Therefore, instances of {@link BeanContext} that share the same <js>"BeanContext.*"</js> property values share</span> |
| <span class="source-line-no">067</span><span id="line-67"> * the same cache. This allows for efficient reuse of <c>ClassMeta</c> objects so that the information about</span> |
| <span class="source-line-no">068</span><span id="line-68"> * classes only needs to be calculated once.</span> |
| <span class="source-line-no">069</span><span id="line-69"> * Because of this, many of the properties defined on the {@link BeanContext} class cannot be overridden on the session.</span> |
| <span class="source-line-no">070</span><span id="line-70"> *</span> |
| <span class="source-line-no">071</span><span id="line-71"> * <h5 class='topic'>Bean Sessions</h5></span> |
| <span class="source-line-no">072</span><span id="line-72"> *</span> |
| <span class="source-line-no">073</span><span id="line-73"> * <p></span> |
| <span class="source-line-no">074</span><span id="line-74"> * Whereas <c>BeanContext</c> objects are permanent, unchangeable, cached, and thread-safe,</span> |
| <span class="source-line-no">075</span><span id="line-75"> * {@link BeanSession} objects are ephemeral and not thread-safe.</span> |
| <span class="source-line-no">076</span><span id="line-76"> * They are meant to be used as quickly-constructed scratchpads for creating bean maps.</span> |
| <span class="source-line-no">077</span><span id="line-77"> * {@link BeanMap} objects can only be created through the session.</span> |
| <span class="source-line-no">078</span><span id="line-78"> *</span> |
| <span class="source-line-no">079</span><span id="line-79"> * <h5 class='topic'>BeanContext configuration properties</h5></span> |
| <span class="source-line-no">080</span><span id="line-80"> *</span> |
| <span class="source-line-no">081</span><span id="line-81"> * <p></span> |
| <span class="source-line-no">082</span><span id="line-82"> * <c>BeanContexts</c> have several configuration properties that can be used to tweak behavior on how beans are</span> |
| <span class="source-line-no">083</span><span id="line-83"> * handled. These are denoted as the static <jsf>BEAN_*</jsf> fields on this class.</span> |
| <span class="source-line-no">084</span><span id="line-84"> *</span> |
| <span class="source-line-no">085</span><span id="line-85"> * <p></span> |
| <span class="source-line-no">086</span><span id="line-86"> * Some settings (e.g. {@link Builder#beansRequireDefaultConstructor()}) are used to differentiate between bean</span> |
| <span class="source-line-no">087</span><span id="line-87"> * and non-bean classes.</span> |
| <span class="source-line-no">088</span><span id="line-88"> * Attempting to create a bean map around one of these objects will throw a {@link BeanRuntimeException}.</span> |
| <span class="source-line-no">089</span><span id="line-89"> * The purpose for this behavior is so that the serializers can identify these non-bean classes and convert them to</span> |
| <span class="source-line-no">090</span><span id="line-90"> * plain strings using the {@link Object#toString()} method.</span> |
| <span class="source-line-no">091</span><span id="line-91"> *</span> |
| <span class="source-line-no">092</span><span id="line-92"> * <p></span> |
| <span class="source-line-no">093</span><span id="line-93"> * Some settings (e.g. {@link Builder#beanFieldVisibility(Visibility)}) are used to determine what kinds of properties are</span> |
| <span class="source-line-no">094</span><span id="line-94"> * detected on beans.</span> |
| <span class="source-line-no">095</span><span id="line-95"> *</span> |
| <span class="source-line-no">096</span><span id="line-96"> * <p></span> |
| <span class="source-line-no">097</span><span id="line-97"> * Some settings (e.g. {@link Builder#beanMapPutReturnsOldValue()}) change the runtime behavior of bean maps.</span> |
| <span class="source-line-no">098</span><span id="line-98"> *</span> |
| <span class="source-line-no">099</span><span id="line-99"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">100</span><span id="line-100"> *</span> |
| <span class="source-line-no">101</span><span id="line-101"> * <p class='bjava'></span> |
| <span class="source-line-no">102</span><span id="line-102"> * <jc>// Construct a context from scratch.</jc></span> |
| <span class="source-line-no">103</span><span id="line-103"> * BeanContext <jv>beanContext</jv> = BeanContext</span> |
| <span class="source-line-no">104</span><span id="line-104"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">105</span><span id="line-105"> * .beansRequireDefaultConstructor()</span> |
| <span class="source-line-no">106</span><span id="line-106"> * .notBeanClasses(Foo.<jk>class</jk>)</span> |
| <span class="source-line-no">107</span><span id="line-107"> * .build();</span> |
| <span class="source-line-no">108</span><span id="line-108"> * </p></span> |
| <span class="source-line-no">109</span><span id="line-109"> *</span> |
| <span class="source-line-no">110</span><span id="line-110"> * <h5 class='topic'>Bean Maps</h5></span> |
| <span class="source-line-no">111</span><span id="line-111"> *</span> |
| <span class="source-line-no">112</span><span id="line-112"> * <p></span> |
| <span class="source-line-no">113</span><span id="line-113"> * {@link BeanMap BeanMaps} are wrappers around Java beans that allow properties to be retrieved and</span> |
| <span class="source-line-no">114</span><span id="line-114"> * set using the common {@link Map#put(Object,Object)} and {@link Map#get(Object)} methods.</span> |
| <span class="source-line-no">115</span><span id="line-115"> *</span> |
| <span class="source-line-no">116</span><span id="line-116"> * <p></span> |
| <span class="source-line-no">117</span><span id="line-117"> * Bean maps are created in two ways...</span> |
| <span class="source-line-no">118</span><span id="line-118"> * <ol></span> |
| <span class="source-line-no">119</span><span id="line-119"> * <li>{@link BeanSession#toBeanMap(Object) BeanSession.toBeanMap()} - Wraps an existing bean inside a {@code Map}</span> |
| <span class="source-line-no">120</span><span id="line-120"> * wrapper.</span> |
| <span class="source-line-no">121</span><span id="line-121"> * <li>{@link BeanSession#newBeanMap(Class) BeanSession.newBeanMap()} - Create a new bean instance wrapped in a</span> |
| <span class="source-line-no">122</span><span id="line-122"> * {@code Map} wrapper.</span> |
| <span class="source-line-no">123</span><span id="line-123"> * </ol></span> |
| <span class="source-line-no">124</span><span id="line-124"> *</span> |
| <span class="source-line-no">125</span><span id="line-125"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">126</span><span id="line-126"> *</span> |
| <span class="source-line-no">127</span><span id="line-127"> * <p class='bjava'></span> |
| <span class="source-line-no">128</span><span id="line-128"> * <jc>// A sample bean class</jc></span> |
| <span class="source-line-no">129</span><span id="line-129"> * <jk>public class</jk> Person {</span> |
| <span class="source-line-no">130</span><span id="line-130"> * <jk>public</jk> String getName();</span> |
| <span class="source-line-no">131</span><span id="line-131"> * <jk>public void</jk> setName(String <jv>name</jv>);</span> |
| <span class="source-line-no">132</span><span id="line-132"> * <jk>public int</jk> getAge();</span> |
| <span class="source-line-no">133</span><span id="line-133"> * <jk>public void</jk> setAge(<jk>int</jk> <jv>age</jv>);</span> |
| <span class="source-line-no">134</span><span id="line-134"> * }</span> |
| <span class="source-line-no">135</span><span id="line-135"> *</span> |
| <span class="source-line-no">136</span><span id="line-136"> * <jc>// Create a new bean session</jc></span> |
| <span class="source-line-no">137</span><span id="line-137"> * BeanSession <jv>session</jv> = BeanContext.<jsf>DEFAULT</jsf>.createSession();</span> |
| <span class="source-line-no">138</span><span id="line-138"> *</span> |
| <span class="source-line-no">139</span><span id="line-139"> * <jc>// Wrap an existing bean in a new bean map</jc></span> |
| <span class="source-line-no">140</span><span id="line-140"> * BeanMap&lt;Person&gt; <jv>map1</jv> = <jv>session</jv>.toBeanMap(<jk>new</jk> Person());</span> |
| <span class="source-line-no">141</span><span id="line-141"> * <jv>map1</jv>.put(<js>"name"</js>, <js>"John Smith"</js>);</span> |
| <span class="source-line-no">142</span><span id="line-142"> * <jv>map1</jv>.put(<js>"age"</js>, 45);</span> |
| <span class="source-line-no">143</span><span id="line-143"> *</span> |
| <span class="source-line-no">144</span><span id="line-144"> * <jc>// Create a new bean instance wrapped in a new bean map</jc></span> |
| <span class="source-line-no">145</span><span id="line-145"> * BeanMap&lt;Person&gt; <jv>map2</jv> = <jv>session</jv>.newBeanMap(Person.<jk>class</jk>);</span> |
| <span class="source-line-no">146</span><span id="line-146"> * <jv>map2</jv>.put(<js>"name"</js>, <js>"John Smith"</js>);</span> |
| <span class="source-line-no">147</span><span id="line-147"> * <jv>map2</jv>.put(<js>"age"</js>, 45);</span> |
| <span class="source-line-no">148</span><span id="line-148"> * Person <jv>person</jv> = <jv>map2</jv>.getBean(); <jc>// Get the bean instance that was created.</jc></span> |
| <span class="source-line-no">149</span><span id="line-149"> * </p></span> |
| <span class="source-line-no">150</span><span id="line-150"> *</span> |
| <span class="source-line-no">151</span><span id="line-151"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">152</span><span id="line-152"> * <li class='note'>This class is thread safe and reusable.</span> |
| <span class="source-line-no">153</span><span id="line-153"> * </ul></span> |
| <span class="source-line-no">154</span><span id="line-154"> *</span> |
| <span class="source-line-no">155</span><span id="line-155"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">156</span><span id="line-156"> * <li class='link'><a class="doclink" href="../../../index.html#jm.BeanContexts">Bean Contexts</a></span> |
| <span class="source-line-no">157</span><span id="line-157"> * </ul></span> |
| <span class="source-line-no">158</span><span id="line-158"> */</span> |
| <span class="source-line-no">159</span><span id="line-159">@SuppressWarnings({"unchecked","rawtypes"})</span> |
| <span class="source-line-no">160</span><span id="line-160">public class BeanContext extends Context {</span> |
| <span class="source-line-no">161</span><span id="line-161"></span> |
| <span class="source-line-no">162</span><span id="line-162"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">163</span><span id="line-163"> // Static</span> |
| <span class="source-line-no">164</span><span id="line-164"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">165</span><span id="line-165"></span> |
| <span class="source-line-no">166</span><span id="line-166"> /*</span> |
| <span class="source-line-no">167</span><span id="line-167"> * The default package pattern exclusion list.</span> |
| <span class="source-line-no">168</span><span id="line-168"> * Any beans in packages in this list will not be considered beans.</span> |
| <span class="source-line-no">169</span><span id="line-169"> */</span> |
| <span class="source-line-no">170</span><span id="line-170"> private static final String[] DEFAULT_NOTBEAN_PACKAGES = {</span> |
| <span class="source-line-no">171</span><span id="line-171"> "java.lang",</span> |
| <span class="source-line-no">172</span><span id="line-172"> "java.lang.annotation",</span> |
| <span class="source-line-no">173</span><span id="line-173"> "java.lang.ref",</span> |
| <span class="source-line-no">174</span><span id="line-174"> "java.lang.reflect",</span> |
| <span class="source-line-no">175</span><span id="line-175"> "java.io",</span> |
| <span class="source-line-no">176</span><span id="line-176"> "java.net",</span> |
| <span class="source-line-no">177</span><span id="line-177"> "java.nio.*",</span> |
| <span class="source-line-no">178</span><span id="line-178"> "java.util.*"</span> |
| <span class="source-line-no">179</span><span id="line-179"> };</span> |
| <span class="source-line-no">180</span><span id="line-180"></span> |
| <span class="source-line-no">181</span><span id="line-181"> /*</span> |
| <span class="source-line-no">182</span><span id="line-182"> * The default bean class exclusion list.</span> |
| <span class="source-line-no">183</span><span id="line-183"> * Anything in this list will not be considered beans.</span> |
| <span class="source-line-no">184</span><span id="line-184"> */</span> |
| <span class="source-line-no">185</span><span id="line-185"> private static final Class<?>[] DEFAULT_NOTBEAN_CLASSES = {</span> |
| <span class="source-line-no">186</span><span id="line-186"> Map.class,</span> |
| <span class="source-line-no">187</span><span id="line-187"> Collection.class,</span> |
| <span class="source-line-no">188</span><span id="line-188"> Reader.class,</span> |
| <span class="source-line-no">189</span><span id="line-189"> Writer.class,</span> |
| <span class="source-line-no">190</span><span id="line-190"> InputStream.class,</span> |
| <span class="source-line-no">191</span><span id="line-191"> OutputStream.class,</span> |
| <span class="source-line-no">192</span><span id="line-192"> Throwable.class</span> |
| <span class="source-line-no">193</span><span id="line-193"> };</span> |
| <span class="source-line-no">194</span><span id="line-194"></span> |
| <span class="source-line-no">195</span><span id="line-195"></span> |
| <span class="source-line-no">196</span><span id="line-196"> /** Default config. All default settings. */</span> |
| <span class="source-line-no">197</span><span id="line-197"> public static final BeanContext DEFAULT = create().build();</span> |
| <span class="source-line-no">198</span><span id="line-198"></span> |
| <span class="source-line-no">199</span><span id="line-199"> /** Default config. All default settings except sort bean properties. */</span> |
| <span class="source-line-no">200</span><span id="line-200"> public static final BeanContext DEFAULT_SORTED = create().sortProperties().build();</span> |
| <span class="source-line-no">201</span><span id="line-201"></span> |
| <span class="source-line-no">202</span><span id="line-202"> /** Default reusable unmodifiable session. Can be used to avoid overhead of creating a session (for creating BeanMaps for example).*/</span> |
| <span class="source-line-no">203</span><span id="line-203"> public static final BeanSession DEFAULT_SESSION = DEFAULT.createSession().unmodifiable().build();</span> |
| <span class="source-line-no">204</span><span id="line-204"></span> |
| <span class="source-line-no">205</span><span id="line-205"> /**</span> |
| <span class="source-line-no">206</span><span id="line-206"> * Creates a new builder for this object.</span> |
| <span class="source-line-no">207</span><span id="line-207"> *</span> |
| <span class="source-line-no">208</span><span id="line-208"> * @return A new builder.</span> |
| <span class="source-line-no">209</span><span id="line-209"> */</span> |
| <span class="source-line-no">210</span><span id="line-210"> public static Builder create() {</span> |
| <span class="source-line-no">211</span><span id="line-211"> return new Builder();</span> |
| <span class="source-line-no">212</span><span id="line-212"> }</span> |
| <span class="source-line-no">213</span><span id="line-213"></span> |
| <span class="source-line-no">214</span><span id="line-214"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">215</span><span id="line-215"> // Builder</span> |
| <span class="source-line-no">216</span><span id="line-216"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">217</span><span id="line-217"></span> |
| <span class="source-line-no">218</span><span id="line-218"> /**</span> |
| <span class="source-line-no">219</span><span id="line-219"> * Builder class.</span> |
| <span class="source-line-no">220</span><span id="line-220"> */</span> |
| <span class="source-line-no">221</span><span id="line-221"> @FluentSetters</span> |
| <span class="source-line-no">222</span><span id="line-222"> public static class Builder extends Context.Builder {</span> |
| <span class="source-line-no">223</span><span id="line-223"></span> |
| <span class="source-line-no">224</span><span id="line-224"> private static final Cache<HashKey,BeanContext> CACHE = Cache.of(HashKey.class, BeanContext.class).build();</span> |
| <span class="source-line-no">225</span><span id="line-225"></span> |
| <span class="source-line-no">226</span><span id="line-226"> Visibility beanClassVisibility, beanConstructorVisibility, beanMethodVisibility, beanFieldVisibility;</span> |
| <span class="source-line-no">227</span><span id="line-227"> boolean disableBeansRequireSomeProperties, beanMapPutReturnsOldValue, beansRequireDefaultConstructor, beansRequireSerializable,</span> |
| <span class="source-line-no">228</span><span id="line-228"> beansRequireSettersForGetters, disableIgnoreTransientFields, disableIgnoreUnknownNullBeanProperties, disableIgnoreMissingSetters,</span> |
| <span class="source-line-no">229</span><span id="line-229"> disableInterfaceProxies, findFluentSetters, ignoreInvocationExceptionsOnGetters, ignoreInvocationExceptionsOnSetters,</span> |
| <span class="source-line-no">230</span><span id="line-230"> ignoreUnknownBeanProperties, ignoreUnknownEnumValues, sortProperties, useEnumNames, useJavaBeanIntrospector;</span> |
| <span class="source-line-no">231</span><span id="line-231"> String typePropertyName;</span> |
| <span class="source-line-no">232</span><span id="line-232"> MediaType mediaType;</span> |
| <span class="source-line-no">233</span><span id="line-233"> Locale locale;</span> |
| <span class="source-line-no">234</span><span id="line-234"> TimeZone timeZone;</span> |
| <span class="source-line-no">235</span><span id="line-235"> Class<? extends PropertyNamer> propertyNamer;</span> |
| <span class="source-line-no">236</span><span id="line-236"> List<Class<?>> beanDictionary;</span> |
| <span class="source-line-no">237</span><span id="line-237"> List<Object> swaps;</span> |
| <span class="source-line-no">238</span><span id="line-238"> Set<Class<?>> notBeanClasses;</span> |
| <span class="source-line-no">239</span><span id="line-239"> Set<String> notBeanPackages;</span> |
| <span class="source-line-no">240</span><span id="line-240"></span> |
| <span class="source-line-no">241</span><span id="line-241"> /**</span> |
| <span class="source-line-no">242</span><span id="line-242"> * Constructor.</span> |
| <span class="source-line-no">243</span><span id="line-243"> *</span> |
| <span class="source-line-no">244</span><span id="line-244"> * All default settings.</span> |
| <span class="source-line-no">245</span><span id="line-245"> */</span> |
| <span class="source-line-no">246</span><span id="line-246"> protected Builder() {</span> |
| <span class="source-line-no">247</span><span id="line-247"> super();</span> |
| <span class="source-line-no">248</span><span id="line-248"> beanClassVisibility = env("BeanContext.beanClassVisibility", PUBLIC);</span> |
| <span class="source-line-no">249</span><span id="line-249"> beanConstructorVisibility = env("BeanContext.beanConstructorVisibility", PUBLIC);</span> |
| <span class="source-line-no">250</span><span id="line-250"> beanMethodVisibility = env("BeanContext.beanMethodVisibility", PUBLIC);</span> |
| <span class="source-line-no">251</span><span id="line-251"> beanFieldVisibility = env("BeanContext.beanFieldVisibility", PUBLIC);</span> |
| <span class="source-line-no">252</span><span id="line-252"> beanDictionary = null;</span> |
| <span class="source-line-no">253</span><span id="line-253"> swaps = null;</span> |
| <span class="source-line-no">254</span><span id="line-254"> notBeanClasses = null;</span> |
| <span class="source-line-no">255</span><span id="line-255"> notBeanPackages = null;</span> |
| <span class="source-line-no">256</span><span id="line-256"> disableBeansRequireSomeProperties = env("BeanContext.disableBeansRequireSomeProperties", false);</span> |
| <span class="source-line-no">257</span><span id="line-257"> beanMapPutReturnsOldValue = env("BeanContext.beanMapPutReturnsOldValue", false);</span> |
| <span class="source-line-no">258</span><span id="line-258"> beansRequireDefaultConstructor = env("BeanContext.beansRequireDefaultConstructor", false);</span> |
| <span class="source-line-no">259</span><span id="line-259"> beansRequireSerializable = env("BeanContext.beansRequireSerializable", false);</span> |
| <span class="source-line-no">260</span><span id="line-260"> beansRequireSettersForGetters = env("BeanContext.beansRequireSettersForGetters", false);</span> |
| <span class="source-line-no">261</span><span id="line-261"> disableIgnoreTransientFields = env("BeanContext.disableIgnoreTransientFields", false);</span> |
| <span class="source-line-no">262</span><span id="line-262"> disableIgnoreUnknownNullBeanProperties = env("BeanContext.disableIgnoreUnknownNullBeanProperties", false);</span> |
| <span class="source-line-no">263</span><span id="line-263"> disableIgnoreMissingSetters = env("BeanContext.disableIgnoreMissingSetters", false);</span> |
| <span class="source-line-no">264</span><span id="line-264"> disableInterfaceProxies = env("BeanContext.disableInterfaceProxies", false);</span> |
| <span class="source-line-no">265</span><span id="line-265"> findFluentSetters = env("BeanContext.findFluentSetters", false);</span> |
| <span class="source-line-no">266</span><span id="line-266"> ignoreInvocationExceptionsOnGetters = env("BeanContext.ignoreInvocationExceptionsOnGetters", false);</span> |
| <span class="source-line-no">267</span><span id="line-267"> ignoreInvocationExceptionsOnSetters = env("BeanContext.ignoreInvocationExceptionsOnSetters", false);</span> |
| <span class="source-line-no">268</span><span id="line-268"> ignoreUnknownBeanProperties = env("BeanContext.ignoreUnknownBeanProperties", false);</span> |
| <span class="source-line-no">269</span><span id="line-269"> ignoreUnknownEnumValues = env("BeanContext.ignoreUnknownEnumValues", false);</span> |
| <span class="source-line-no">270</span><span id="line-270"> sortProperties = env("BeanContext.sortProperties", false);</span> |
| <span class="source-line-no">271</span><span id="line-271"> useEnumNames = env("BeanContext.useEnumNames", false);</span> |
| <span class="source-line-no">272</span><span id="line-272"> useJavaBeanIntrospector = env("BeanContext.useJavaBeanIntrospector", false);</span> |
| <span class="source-line-no">273</span><span id="line-273"> typePropertyName = env("BeanContext.typePropertyName", "_type");</span> |
| <span class="source-line-no">274</span><span id="line-274"> mediaType = env("BeanContext.mediaType", (MediaType)null);</span> |
| <span class="source-line-no">275</span><span id="line-275"> timeZone = env("BeanContext.timeZone", (TimeZone)null);</span> |
| <span class="source-line-no">276</span><span id="line-276"> locale = env("BeanContext.locale", Locale.getDefault());</span> |
| <span class="source-line-no">277</span><span id="line-277"> propertyNamer = null;</span> |
| <span class="source-line-no">278</span><span id="line-278"> }</span> |
| <span class="source-line-no">279</span><span id="line-279"></span> |
| <span class="source-line-no">280</span><span id="line-280"> /**</span> |
| <span class="source-line-no">281</span><span id="line-281"> * Copy constructor.</span> |
| <span class="source-line-no">282</span><span id="line-282"> *</span> |
| <span class="source-line-no">283</span><span id="line-283"> * @param copyFrom The bean to copy from.</span> |
| <span class="source-line-no">284</span><span id="line-284"> */</span> |
| <span class="source-line-no">285</span><span id="line-285"> protected Builder(BeanContext copyFrom) {</span> |
| <span class="source-line-no">286</span><span id="line-286"> super(copyFrom);</span> |
| <span class="source-line-no">287</span><span id="line-287"> beanClassVisibility = copyFrom.beanClassVisibility;</span> |
| <span class="source-line-no">288</span><span id="line-288"> beanConstructorVisibility = copyFrom.beanConstructorVisibility;</span> |
| <span class="source-line-no">289</span><span id="line-289"> beanMethodVisibility = copyFrom.beanMethodVisibility;</span> |
| <span class="source-line-no">290</span><span id="line-290"> beanFieldVisibility = copyFrom.beanFieldVisibility;</span> |
| <span class="source-line-no">291</span><span id="line-291"> beanDictionary = listFrom(copyFrom.beanDictionary, true);</span> |
| <span class="source-line-no">292</span><span id="line-292"> swaps = listFrom(copyFrom.swaps, true);</span> |
| <span class="source-line-no">293</span><span id="line-293"> notBeanClasses = classSet(copyFrom.notBeanClasses, true);</span> |
| <span class="source-line-no">294</span><span id="line-294"> notBeanPackages = sortedSetFrom(copyFrom.notBeanPackages, true);</span> |
| <span class="source-line-no">295</span><span id="line-295"> disableBeansRequireSomeProperties = ! copyFrom.beansRequireSomeProperties;</span> |
| <span class="source-line-no">296</span><span id="line-296"> beanMapPutReturnsOldValue = copyFrom.beanMapPutReturnsOldValue;</span> |
| <span class="source-line-no">297</span><span id="line-297"> beansRequireDefaultConstructor = copyFrom.beansRequireDefaultConstructor;</span> |
| <span class="source-line-no">298</span><span id="line-298"> beansRequireSerializable = copyFrom.beansRequireSerializable;</span> |
| <span class="source-line-no">299</span><span id="line-299"> beansRequireSettersForGetters = copyFrom.beansRequireSettersForGetters;</span> |
| <span class="source-line-no">300</span><span id="line-300"> disableIgnoreTransientFields = ! copyFrom.ignoreTransientFields;</span> |
| <span class="source-line-no">301</span><span id="line-301"> disableIgnoreUnknownNullBeanProperties = ! copyFrom.ignoreUnknownNullBeanProperties;</span> |
| <span class="source-line-no">302</span><span id="line-302"> disableIgnoreMissingSetters = ! copyFrom.ignoreMissingSetters;</span> |
| <span class="source-line-no">303</span><span id="line-303"> disableInterfaceProxies = ! copyFrom.useInterfaceProxies;</span> |
| <span class="source-line-no">304</span><span id="line-304"> findFluentSetters = copyFrom.findFluentSetters;</span> |
| <span class="source-line-no">305</span><span id="line-305"> ignoreInvocationExceptionsOnGetters = copyFrom.ignoreInvocationExceptionsOnGetters;</span> |
| <span class="source-line-no">306</span><span id="line-306"> ignoreInvocationExceptionsOnSetters = copyFrom.ignoreInvocationExceptionsOnSetters;</span> |
| <span class="source-line-no">307</span><span id="line-307"> ignoreUnknownBeanProperties = copyFrom.ignoreUnknownBeanProperties;</span> |
| <span class="source-line-no">308</span><span id="line-308"> ignoreUnknownEnumValues = copyFrom.ignoreUnknownEnumValues;</span> |
| <span class="source-line-no">309</span><span id="line-309"> sortProperties = copyFrom.sortProperties;</span> |
| <span class="source-line-no">310</span><span id="line-310"> useEnumNames = copyFrom.useEnumNames;</span> |
| <span class="source-line-no">311</span><span id="line-311"> useJavaBeanIntrospector = copyFrom.useJavaBeanIntrospector;</span> |
| <span class="source-line-no">312</span><span id="line-312"> typePropertyName = copyFrom.typePropertyName;</span> |
| <span class="source-line-no">313</span><span id="line-313"> mediaType = copyFrom.mediaType;</span> |
| <span class="source-line-no">314</span><span id="line-314"> timeZone = copyFrom.timeZone;</span> |
| <span class="source-line-no">315</span><span id="line-315"> locale = copyFrom.locale;</span> |
| <span class="source-line-no">316</span><span id="line-316"> propertyNamer = copyFrom.propertyNamer;</span> |
| <span class="source-line-no">317</span><span id="line-317"> }</span> |
| <span class="source-line-no">318</span><span id="line-318"></span> |
| <span class="source-line-no">319</span><span id="line-319"> /**</span> |
| <span class="source-line-no">320</span><span id="line-320"> * Copy constructor.</span> |
| <span class="source-line-no">321</span><span id="line-321"> *</span> |
| <span class="source-line-no">322</span><span id="line-322"> * @param copyFrom The builder to copy from.</span> |
| <span class="source-line-no">323</span><span id="line-323"> */</span> |
| <span class="source-line-no">324</span><span id="line-324"> protected Builder(Builder copyFrom) {</span> |
| <span class="source-line-no">325</span><span id="line-325"> super(copyFrom);</span> |
| <span class="source-line-no">326</span><span id="line-326"> beanClassVisibility = copyFrom.beanClassVisibility;</span> |
| <span class="source-line-no">327</span><span id="line-327"> beanConstructorVisibility = copyFrom.beanConstructorVisibility;</span> |
| <span class="source-line-no">328</span><span id="line-328"> beanMethodVisibility = copyFrom.beanMethodVisibility;</span> |
| <span class="source-line-no">329</span><span id="line-329"> beanFieldVisibility = copyFrom.beanFieldVisibility;</span> |
| <span class="source-line-no">330</span><span id="line-330"> beanDictionary = copyOf(copyFrom.beanDictionary);</span> |
| <span class="source-line-no">331</span><span id="line-331"> swaps = copyOf(copyFrom.swaps);</span> |
| <span class="source-line-no">332</span><span id="line-332"> notBeanClasses = classSet(copyFrom.notBeanClasses);</span> |
| <span class="source-line-no">333</span><span id="line-333"> notBeanPackages = sortedSetFrom(copyFrom.notBeanPackages);</span> |
| <span class="source-line-no">334</span><span id="line-334"> disableBeansRequireSomeProperties = copyFrom.disableBeansRequireSomeProperties;</span> |
| <span class="source-line-no">335</span><span id="line-335"> beanMapPutReturnsOldValue = copyFrom.beanMapPutReturnsOldValue;</span> |
| <span class="source-line-no">336</span><span id="line-336"> beansRequireDefaultConstructor = copyFrom.beansRequireDefaultConstructor;</span> |
| <span class="source-line-no">337</span><span id="line-337"> beansRequireSerializable = copyFrom.beansRequireSerializable;</span> |
| <span class="source-line-no">338</span><span id="line-338"> beansRequireSettersForGetters = copyFrom.beansRequireSettersForGetters;</span> |
| <span class="source-line-no">339</span><span id="line-339"> disableIgnoreTransientFields = copyFrom.disableIgnoreTransientFields;</span> |
| <span class="source-line-no">340</span><span id="line-340"> disableIgnoreUnknownNullBeanProperties = copyFrom.disableIgnoreUnknownNullBeanProperties;</span> |
| <span class="source-line-no">341</span><span id="line-341"> disableIgnoreMissingSetters = copyFrom.disableIgnoreMissingSetters;</span> |
| <span class="source-line-no">342</span><span id="line-342"> disableInterfaceProxies = copyFrom.disableInterfaceProxies;</span> |
| <span class="source-line-no">343</span><span id="line-343"> findFluentSetters = copyFrom.findFluentSetters;</span> |
| <span class="source-line-no">344</span><span id="line-344"> ignoreInvocationExceptionsOnGetters = copyFrom.ignoreInvocationExceptionsOnGetters;</span> |
| <span class="source-line-no">345</span><span id="line-345"> ignoreInvocationExceptionsOnSetters = copyFrom.ignoreInvocationExceptionsOnSetters;</span> |
| <span class="source-line-no">346</span><span id="line-346"> ignoreUnknownBeanProperties = copyFrom.ignoreUnknownBeanProperties;</span> |
| <span class="source-line-no">347</span><span id="line-347"> ignoreUnknownEnumValues = copyFrom.ignoreUnknownEnumValues;</span> |
| <span class="source-line-no">348</span><span id="line-348"> sortProperties = copyFrom.sortProperties;</span> |
| <span class="source-line-no">349</span><span id="line-349"> useEnumNames = copyFrom.useEnumNames;</span> |
| <span class="source-line-no">350</span><span id="line-350"> useJavaBeanIntrospector = copyFrom.useJavaBeanIntrospector;</span> |
| <span class="source-line-no">351</span><span id="line-351"> typePropertyName = copyFrom.typePropertyName;</span> |
| <span class="source-line-no">352</span><span id="line-352"> mediaType = copyFrom.mediaType;</span> |
| <span class="source-line-no">353</span><span id="line-353"> timeZone = copyFrom.timeZone;</span> |
| <span class="source-line-no">354</span><span id="line-354"> locale = copyFrom.locale;</span> |
| <span class="source-line-no">355</span><span id="line-355"> propertyNamer = copyFrom.propertyNamer;</span> |
| <span class="source-line-no">356</span><span id="line-356"> }</span> |
| <span class="source-line-no">357</span><span id="line-357"></span> |
| <span class="source-line-no">358</span><span id="line-358"> @Override /* Context.Builder */</span> |
| <span class="source-line-no">359</span><span id="line-359"> public Builder copy() {</span> |
| <span class="source-line-no">360</span><span id="line-360"> return new Builder(this);</span> |
| <span class="source-line-no">361</span><span id="line-361"> }</span> |
| <span class="source-line-no">362</span><span id="line-362"></span> |
| <span class="source-line-no">363</span><span id="line-363"> @Override /* Context.Builder */</span> |
| <span class="source-line-no">364</span><span id="line-364"> public BeanContext build() {</span> |
| <span class="source-line-no">365</span><span id="line-365"> return cache(CACHE).build(BeanContext.class);</span> |
| <span class="source-line-no">366</span><span id="line-366"> }</span> |
| <span class="source-line-no">367</span><span id="line-367"></span> |
| <span class="source-line-no">368</span><span id="line-368"> @Override /* Context.Builder */</span> |
| <span class="source-line-no">369</span><span id="line-369"> public HashKey hashKey() {</span> |
| <span class="source-line-no">370</span><span id="line-370"> return HashKey.of(</span> |
| <span class="source-line-no">371</span><span id="line-371"> super.hashKey(),</span> |
| <span class="source-line-no">372</span><span id="line-372"> beanClassVisibility,</span> |
| <span class="source-line-no">373</span><span id="line-373"> beanConstructorVisibility,</span> |
| <span class="source-line-no">374</span><span id="line-374"> beanMethodVisibility,</span> |
| <span class="source-line-no">375</span><span id="line-375"> beanFieldVisibility,</span> |
| <span class="source-line-no">376</span><span id="line-376"> beanDictionary,</span> |
| <span class="source-line-no">377</span><span id="line-377"> swaps,</span> |
| <span class="source-line-no">378</span><span id="line-378"> notBeanClasses,</span> |
| <span class="source-line-no">379</span><span id="line-379"> notBeanPackages,</span> |
| <span class="source-line-no">380</span><span id="line-380"> integer(</span> |
| <span class="source-line-no">381</span><span id="line-381"> disableBeansRequireSomeProperties,</span> |
| <span class="source-line-no">382</span><span id="line-382"> beanMapPutReturnsOldValue,</span> |
| <span class="source-line-no">383</span><span id="line-383"> beansRequireDefaultConstructor,</span> |
| <span class="source-line-no">384</span><span id="line-384"> beansRequireSerializable,</span> |
| <span class="source-line-no">385</span><span id="line-385"> beansRequireSettersForGetters,</span> |
| <span class="source-line-no">386</span><span id="line-386"> disableIgnoreTransientFields,</span> |
| <span class="source-line-no">387</span><span id="line-387"> disableIgnoreUnknownNullBeanProperties,</span> |
| <span class="source-line-no">388</span><span id="line-388"> disableIgnoreMissingSetters,</span> |
| <span class="source-line-no">389</span><span id="line-389"> disableInterfaceProxies,</span> |
| <span class="source-line-no">390</span><span id="line-390"> findFluentSetters,</span> |
| <span class="source-line-no">391</span><span id="line-391"> ignoreInvocationExceptionsOnGetters,</span> |
| <span class="source-line-no">392</span><span id="line-392"> ignoreInvocationExceptionsOnSetters,</span> |
| <span class="source-line-no">393</span><span id="line-393"> ignoreUnknownBeanProperties,</span> |
| <span class="source-line-no">394</span><span id="line-394"> ignoreUnknownEnumValues,</span> |
| <span class="source-line-no">395</span><span id="line-395"> sortProperties,</span> |
| <span class="source-line-no">396</span><span id="line-396"> useEnumNames,</span> |
| <span class="source-line-no">397</span><span id="line-397"> useJavaBeanIntrospector</span> |
| <span class="source-line-no">398</span><span id="line-398"> ),</span> |
| <span class="source-line-no">399</span><span id="line-399"> typePropertyName,</span> |
| <span class="source-line-no">400</span><span id="line-400"> mediaType,</span> |
| <span class="source-line-no">401</span><span id="line-401"> timeZone,</span> |
| <span class="source-line-no">402</span><span id="line-402"> locale,</span> |
| <span class="source-line-no">403</span><span id="line-403"> propertyNamer</span> |
| <span class="source-line-no">404</span><span id="line-404"> );</span> |
| <span class="source-line-no">405</span><span id="line-405"> }</span> |
| <span class="source-line-no">406</span><span id="line-406"></span> |
| <span class="source-line-no">407</span><span id="line-407"> private int integer(boolean...values) {</span> |
| <span class="source-line-no">408</span><span id="line-408"> int n = 0;</span> |
| <span class="source-line-no">409</span><span id="line-409"> for (boolean b : values)</span> |
| <span class="source-line-no">410</span><span id="line-410"> n = (n << 1) | (b ? 1 : 0);</span> |
| <span class="source-line-no">411</span><span id="line-411"> return n;</span> |
| <span class="source-line-no">412</span><span id="line-412"> }</span> |
| <span class="source-line-no">413</span><span id="line-413"></span> |
| <span class="source-line-no">414</span><span id="line-414"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">415</span><span id="line-415"> // Properties</span> |
| <span class="source-line-no">416</span><span id="line-416"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">417</span><span id="line-417"></span> |
| <span class="source-line-no">418</span><span id="line-418"> /**</span> |
| <span class="source-line-no">419</span><span id="line-419"> * Minimum bean class visibility.</span> |
| <span class="source-line-no">420</span><span id="line-420"> *</span> |
| <span class="source-line-no">421</span><span id="line-421"> * <p></span> |
| <span class="source-line-no">422</span><span id="line-422"> * Classes are not considered beans unless they meet the minimum visibility requirements.</span> |
| <span class="source-line-no">423</span><span id="line-423"> * For example, if the visibility is <jsf>PUBLIC</jsf> and the bean class is <jk>protected</jk>, then the class</span> |
| <span class="source-line-no">424</span><span id="line-424"> * will not be interpreted as a bean class and be serialized as a string.</span> |
| <span class="source-line-no">425</span><span id="line-425"> * Use this setting to reduce the visibility requirement.</span> |
| <span class="source-line-no">426</span><span id="line-426"> *</span> |
| <span class="source-line-no">427</span><span id="line-427"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">428</span><span id="line-428"> * <p class='bjava'></span> |
| <span class="source-line-no">429</span><span id="line-429"> * <jc>// A bean with a protected class and one field.</jc></span> |
| <span class="source-line-no">430</span><span id="line-430"> * <jk>protected class</jk> MyBean {</span> |
| <span class="source-line-no">431</span><span id="line-431"> * <jk>public</jk> String <jf>foo</jf> = <js>"bar"</js>;</span> |
| <span class="source-line-no">432</span><span id="line-432"> * }</span> |
| <span class="source-line-no">433</span><span id="line-433"> *</span> |
| <span class="source-line-no">434</span><span id="line-434"> * <jc>// Create a serializer that's capable of serializing the class.</jc></span> |
| <span class="source-line-no">435</span><span id="line-435"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">436</span><span id="line-436"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">437</span><span id="line-437"> * .beanClassVisibility(<jsf>PROTECTED</jsf>)</span> |
| <span class="source-line-no">438</span><span id="line-438"> * .build();</span> |
| <span class="source-line-no">439</span><span id="line-439"> *</span> |
| <span class="source-line-no">440</span><span id="line-440"> * <jc>// Produces: {"foo","bar"}</jc></span> |
| <span class="source-line-no">441</span><span id="line-441"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">442</span><span id="line-442"> * </p></span> |
| <span class="source-line-no">443</span><span id="line-443"> *</span> |
| <span class="source-line-no">444</span><span id="line-444"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">445</span><span id="line-445"> * <li class='note'>The {@link Bean @Bean} annotation can be used on a non-public bean class to override this setting.</span> |
| <span class="source-line-no">446</span><span id="line-446"> * <li class='note'>The {@link BeanIgnore @BeanIgnore} annotation can also be used on a public bean class to ignore it as a bean.</span> |
| <span class="source-line-no">447</span><span id="line-447"> * </ul></span> |
| <span class="source-line-no">448</span><span id="line-448"> *</span> |
| <span class="source-line-no">449</span><span id="line-449"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">450</span><span id="line-450"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#beanClassVisibility()}</span> |
| <span class="source-line-no">451</span><span id="line-451"> * </ul></span> |
| <span class="source-line-no">452</span><span id="line-452"> *</span> |
| <span class="source-line-no">453</span><span id="line-453"> * @param value</span> |
| <span class="source-line-no">454</span><span id="line-454"> * The new value for this setting.</span> |
| <span class="source-line-no">455</span><span id="line-455"> * <br>The default is {@link Visibility#PUBLIC}.</span> |
| <span class="source-line-no">456</span><span id="line-456"> * @return This object.</span> |
| <span class="source-line-no">457</span><span id="line-457"> */</span> |
| <span class="source-line-no">458</span><span id="line-458"> @FluentSetter</span> |
| <span class="source-line-no">459</span><span id="line-459"> public Builder beanClassVisibility(Visibility value) {</span> |
| <span class="source-line-no">460</span><span id="line-460"> beanClassVisibility = value;</span> |
| <span class="source-line-no">461</span><span id="line-461"> return this;</span> |
| <span class="source-line-no">462</span><span id="line-462"> }</span> |
| <span class="source-line-no">463</span><span id="line-463"></span> |
| <span class="source-line-no">464</span><span id="line-464"> /**</span> |
| <span class="source-line-no">465</span><span id="line-465"> * Minimum bean constructor visibility.</span> |
| <span class="source-line-no">466</span><span id="line-466"> *</span> |
| <span class="source-line-no">467</span><span id="line-467"> * <p></span> |
| <span class="source-line-no">468</span><span id="line-468"> * Only look for constructors with the specified minimum visibility.</span> |
| <span class="source-line-no">469</span><span id="line-469"> *</span> |
| <span class="source-line-no">470</span><span id="line-470"> * <p></span> |
| <span class="source-line-no">471</span><span id="line-471"> * This setting affects the logic for finding no-arg constructors for bean. Normally, only <jk>public</jk> no-arg</span> |
| <span class="source-line-no">472</span><span id="line-472"> * constructors are used. Use this setting if you want to reduce the visibility requirement.</span> |
| <span class="source-line-no">473</span><span id="line-473"> *</span> |
| <span class="source-line-no">474</span><span id="line-474"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">475</span><span id="line-475"> * <p class='bjava'></span> |
| <span class="source-line-no">476</span><span id="line-476"> * <jc>// A bean with a protected constructor and one field.</jc></span> |
| <span class="source-line-no">477</span><span id="line-477"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">478</span><span id="line-478"> * <jk>public</jk> String <jf>foo</jf>;</span> |
| <span class="source-line-no">479</span><span id="line-479"> *</span> |
| <span class="source-line-no">480</span><span id="line-480"> * <jk>protected</jk> MyBean() {}</span> |
| <span class="source-line-no">481</span><span id="line-481"> * }</span> |
| <span class="source-line-no">482</span><span id="line-482"> *</span> |
| <span class="source-line-no">483</span><span id="line-483"> * <jc>// Create a parser capable of calling the protected constructor.</jc></span> |
| <span class="source-line-no">484</span><span id="line-484"> * ReaderParser <jv>parser</jv> = ReaderParser</span> |
| <span class="source-line-no">485</span><span id="line-485"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">486</span><span id="line-486"> * .beanConstructorVisibility(<jsf>PROTECTED</jsf>)</span> |
| <span class="source-line-no">487</span><span id="line-487"> * .build();</span> |
| <span class="source-line-no">488</span><span id="line-488"> *</span> |
| <span class="source-line-no">489</span><span id="line-489"> * <jc>// Use it.</jc></span> |
| <span class="source-line-no">490</span><span id="line-490"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'bar'}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">491</span><span id="line-491"> * </p></span> |
| <span class="source-line-no">492</span><span id="line-492"> *</span> |
| <span class="source-line-no">493</span><span id="line-493"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">494</span><span id="line-494"> * <li class='note'>The {@link Beanc @Beanc} annotation can also be used to expose a non-public constructor.</span> |
| <span class="source-line-no">495</span><span id="line-495"> * <li class='note'>The {@link BeanIgnore @BeanIgnore} annotation can also be used on a public bean constructor to ignore it.</span> |
| <span class="source-line-no">496</span><span id="line-496"> * </ul></span> |
| <span class="source-line-no">497</span><span id="line-497"> *</span> |
| <span class="source-line-no">498</span><span id="line-498"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">499</span><span id="line-499"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#beanConstructorVisibility()}</span> |
| <span class="source-line-no">500</span><span id="line-500"> * </ul></span> |
| <span class="source-line-no">501</span><span id="line-501"> *</span> |
| <span class="source-line-no">502</span><span id="line-502"> * @param value</span> |
| <span class="source-line-no">503</span><span id="line-503"> * The new value for this setting.</span> |
| <span class="source-line-no">504</span><span id="line-504"> * <br>The default is {@link Visibility#PUBLIC}.</span> |
| <span class="source-line-no">505</span><span id="line-505"> * @return This object.</span> |
| <span class="source-line-no">506</span><span id="line-506"> */</span> |
| <span class="source-line-no">507</span><span id="line-507"> @FluentSetter</span> |
| <span class="source-line-no">508</span><span id="line-508"> public Builder beanConstructorVisibility(Visibility value) {</span> |
| <span class="source-line-no">509</span><span id="line-509"> beanConstructorVisibility = value;</span> |
| <span class="source-line-no">510</span><span id="line-510"> return this;</span> |
| <span class="source-line-no">511</span><span id="line-511"> }</span> |
| <span class="source-line-no">512</span><span id="line-512"></span> |
| <span class="source-line-no">513</span><span id="line-513"> /**</span> |
| <span class="source-line-no">514</span><span id="line-514"> * Minimum bean field visibility.</span> |
| <span class="source-line-no">515</span><span id="line-515"> *</span> |
| <span class="source-line-no">516</span><span id="line-516"> * <p></span> |
| <span class="source-line-no">517</span><span id="line-517"> * Only look for bean fields with the specified minimum visibility.</span> |
| <span class="source-line-no">518</span><span id="line-518"> *</span> |
| <span class="source-line-no">519</span><span id="line-519"> * <p></span> |
| <span class="source-line-no">520</span><span id="line-520"> * This affects which fields on a bean class are considered bean properties. Normally only <jk>public</jk> fields are considered.</span> |
| <span class="source-line-no">521</span><span id="line-521"> * Use this setting if you want to reduce the visibility requirement.</span> |
| <span class="source-line-no">522</span><span id="line-522"> *</span> |
| <span class="source-line-no">523</span><span id="line-523"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">524</span><span id="line-524"> * <p class='bjava'></span> |
| <span class="source-line-no">525</span><span id="line-525"> * <jc>// A bean with a protected field.</jc></span> |
| <span class="source-line-no">526</span><span id="line-526"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">527</span><span id="line-527"> * <jk>protected</jk> String <jf>foo</jf> = <js>"bar"</js>;</span> |
| <span class="source-line-no">528</span><span id="line-528"> * }</span> |
| <span class="source-line-no">529</span><span id="line-529"> *</span> |
| <span class="source-line-no">530</span><span id="line-530"> * <jc>// Create a serializer that recognizes the protected field.</jc></span> |
| <span class="source-line-no">531</span><span id="line-531"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">532</span><span id="line-532"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">533</span><span id="line-533"> * .beanFieldVisibility(<jsf>PROTECTED</jsf>)</span> |
| <span class="source-line-no">534</span><span id="line-534"> * .build();</span> |
| <span class="source-line-no">535</span><span id="line-535"> *</span> |
| <span class="source-line-no">536</span><span id="line-536"> * <jc>// Produces: {"foo":"bar"}</jc></span> |
| <span class="source-line-no">537</span><span id="line-537"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">538</span><span id="line-538"> * </p></span> |
| <span class="source-line-no">539</span><span id="line-539"> *</span> |
| <span class="source-line-no">540</span><span id="line-540"> * <p></span> |
| <span class="source-line-no">541</span><span id="line-541"> * Bean fields can be ignored as properties entirely by setting the value to {@link Visibility#NONE}</span> |
| <span class="source-line-no">542</span><span id="line-542"> *</span> |
| <span class="source-line-no">543</span><span id="line-543"> * <p class='bjava'></span> |
| <span class="source-line-no">544</span><span id="line-544"> * <jc>// Disable using fields as properties entirely.</jc></span> |
| <span class="source-line-no">545</span><span id="line-545"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">546</span><span id="line-546"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">547</span><span id="line-547"> * .beanFieldVisibility(<jsf>NONE</jsf>)</span> |
| <span class="source-line-no">548</span><span id="line-548"> * .build();</span> |
| <span class="source-line-no">549</span><span id="line-549"> * </p></span> |
| <span class="source-line-no">550</span><span id="line-550"> *</span> |
| <span class="source-line-no">551</span><span id="line-551"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">552</span><span id="line-552"> * <li class='note'>The {@link Beanp @Beanp} annotation can also be used to expose a non-public field.</span> |
| <span class="source-line-no">553</span><span id="line-553"> * <li class='note'>The {@link BeanIgnore @BeanIgnore} annotation can also be used on a public bean field to ignore it as a bean property.</span> |
| <span class="source-line-no">554</span><span id="line-554"> * </ul></span> |
| <span class="source-line-no">555</span><span id="line-555"> *</span> |
| <span class="source-line-no">556</span><span id="line-556"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">557</span><span id="line-557"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#beanFieldVisibility()}</span> |
| <span class="source-line-no">558</span><span id="line-558"> * </ul></span> |
| <span class="source-line-no">559</span><span id="line-559"> *</span> |
| <span class="source-line-no">560</span><span id="line-560"> * @param value</span> |
| <span class="source-line-no">561</span><span id="line-561"> * The new value for this setting.</span> |
| <span class="source-line-no">562</span><span id="line-562"> * <br>The default is {@link Visibility#PUBLIC}.</span> |
| <span class="source-line-no">563</span><span id="line-563"> * @return This object.</span> |
| <span class="source-line-no">564</span><span id="line-564"> */</span> |
| <span class="source-line-no">565</span><span id="line-565"> @FluentSetter</span> |
| <span class="source-line-no">566</span><span id="line-566"> public Builder beanFieldVisibility(Visibility value) {</span> |
| <span class="source-line-no">567</span><span id="line-567"> beanFieldVisibility = value;</span> |
| <span class="source-line-no">568</span><span id="line-568"> return this;</span> |
| <span class="source-line-no">569</span><span id="line-569"> }</span> |
| <span class="source-line-no">570</span><span id="line-570"></span> |
| <span class="source-line-no">571</span><span id="line-571"> /**</span> |
| <span class="source-line-no">572</span><span id="line-572"> * Bean interceptor.</span> |
| <span class="source-line-no">573</span><span id="line-573"> *</span> |
| <span class="source-line-no">574</span><span id="line-574"> * <p></span> |
| <span class="source-line-no">575</span><span id="line-575"> * Bean interceptors can be used to intercept calls to getters and setters and alter their values in transit.</span> |
| <span class="source-line-no">576</span><span id="line-576"> *</span> |
| <span class="source-line-no">577</span><span id="line-577"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">578</span><span id="line-578"> * <p class='bjava'></span> |
| <span class="source-line-no">579</span><span id="line-579"> * <jc>// Interceptor that strips out sensitive information.</jc></span> |
| <span class="source-line-no">580</span><span id="line-580"> * <jk>public class</jk> AddressInterceptor <jk>extends</jk> BeanInterceptor&lt;Address&gt; {</span> |
| <span class="source-line-no">581</span><span id="line-581"> *</span> |
| <span class="source-line-no">582</span><span id="line-582"> * <jk>public</jk> Object readProperty(Address <jv>bean</jv>, String <jv>name</jv>, Object <jv>value</jv>) {</span> |
| <span class="source-line-no">583</span><span id="line-583"> * <jk>if</jk> (<js>"taxInfo"</js>.equals(<jv>name</jv>))</span> |
| <span class="source-line-no">584</span><span id="line-584"> * <jk>return</jk> <js>"redacted"</js>;</span> |
| <span class="source-line-no">585</span><span id="line-585"> * <jk>return</jk> <jv>value</jv>;</span> |
| <span class="source-line-no">586</span><span id="line-586"> * }</span> |
| <span class="source-line-no">587</span><span id="line-587"> *</span> |
| <span class="source-line-no">588</span><span id="line-588"> * <jk>public</jk> Object writeProperty(Address <jv>bean</jv>, String <jv>name</jv>, Object <jv>value</jv>) {</span> |
| <span class="source-line-no">589</span><span id="line-589"> * <jk>if</jk> (<js>"taxInfo"</js>.equals(<jv>name</jv>) &amp;&amp; <js>"redacted"</js>.equals(<jv>value</jv>))</span> |
| <span class="source-line-no">590</span><span id="line-590"> * <jk>return</jk> TaxInfoUtils.<jsm>lookup</jsm>(<jv>bean</jv>.getStreet(), <jv>bean</jv>.getCity(), <jv>bean</jv>.getState());</span> |
| <span class="source-line-no">591</span><span id="line-591"> * <jk>return</jk> <jv>value</jv>;</span> |
| <span class="source-line-no">592</span><span id="line-592"> * }</span> |
| <span class="source-line-no">593</span><span id="line-593"> * }</span> |
| <span class="source-line-no">594</span><span id="line-594"> *</span> |
| <span class="source-line-no">595</span><span id="line-595"> * <jc>// Our bean class.</jc></span> |
| <span class="source-line-no">596</span><span id="line-596"> * <jk>public class</jk> Address {</span> |
| <span class="source-line-no">597</span><span id="line-597"> * <jk>public</jk> String getTaxInfo() {...}</span> |
| <span class="source-line-no">598</span><span id="line-598"> * <jk>public void</jk> setTaxInfo(String <jv>value</jv>) {...}</span> |
| <span class="source-line-no">599</span><span id="line-599"> * }</span> |
| <span class="source-line-no">600</span><span id="line-600"> *</span> |
| <span class="source-line-no">601</span><span id="line-601"> * <jc>// Register filter on serializer or parser.</jc></span> |
| <span class="source-line-no">602</span><span id="line-602"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">603</span><span id="line-603"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">604</span><span id="line-604"> * .beanInterceptor(Address.<jk>class</jk>, AddressInterceptor.<jk>class</jk>)</span> |
| <span class="source-line-no">605</span><span id="line-605"> * .build();</span> |
| <span class="source-line-no">606</span><span id="line-606"> *</span> |
| <span class="source-line-no">607</span><span id="line-607"> * <jc>// Produces: {"taxInfo":"redacted"}</jc></span> |
| <span class="source-line-no">608</span><span id="line-608"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> Address());</span> |
| <span class="source-line-no">609</span><span id="line-609"> * </p></span> |
| <span class="source-line-no">610</span><span id="line-610"> *</span> |
| <span class="source-line-no">611</span><span id="line-611"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">612</span><span id="line-612"> * <li class='jc'>{@link BeanInterceptor}</span> |
| <span class="source-line-no">613</span><span id="line-613"> * <li class='ja'>{@link Bean#interceptor() Bean(interceptor)}</span> |
| <span class="source-line-no">614</span><span id="line-614"> * </ul></span> |
| <span class="source-line-no">615</span><span id="line-615"> *</span> |
| <span class="source-line-no">616</span><span id="line-616"> * @param on The bean that the filter applies to.</span> |
| <span class="source-line-no">617</span><span id="line-617"> * @param value</span> |
| <span class="source-line-no">618</span><span id="line-618"> * The new value for this setting.</span> |
| <span class="source-line-no">619</span><span id="line-619"> * @return This object.</span> |
| <span class="source-line-no">620</span><span id="line-620"> */</span> |
| <span class="source-line-no">621</span><span id="line-621"> @FluentSetter</span> |
| <span class="source-line-no">622</span><span id="line-622"> public Builder beanInterceptor(Class<?> on, Class<? extends BeanInterceptor<?>> value) {</span> |
| <span class="source-line-no">623</span><span id="line-623"> return annotations(BeanAnnotation.create(on).interceptor(value).build());</span> |
| <span class="source-line-no">624</span><span id="line-624"> }</span> |
| <span class="source-line-no">625</span><span id="line-625"></span> |
| <span class="source-line-no">626</span><span id="line-626"> /**</span> |
| <span class="source-line-no">627</span><span id="line-627"> * BeanMap.put() returns old property value.</span> |
| <span class="source-line-no">628</span><span id="line-628"> *</span> |
| <span class="source-line-no">629</span><span id="line-629"> * <p></span> |
| <span class="source-line-no">630</span><span id="line-630"> * When enabled, then the {@link BeanMap#put(String,Object) BeanMap.put()} method will return old property</span> |
| <span class="source-line-no">631</span><span id="line-631"> * values. Otherwise, it returns <jk>null</jk>.</span> |
| <span class="source-line-no">632</span><span id="line-632"> *</span> |
| <span class="source-line-no">633</span><span id="line-633"> * <p></span> |
| <span class="source-line-no">634</span><span id="line-634"> * Disabled by default because it introduces a slight performance penalty during serialization.</span> |
| <span class="source-line-no">635</span><span id="line-635"> *</span> |
| <span class="source-line-no">636</span><span id="line-636"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">637</span><span id="line-637"> * <p class='bjava'></span> |
| <span class="source-line-no">638</span><span id="line-638"> * <jc>// Create a context that creates BeanMaps with normal put() behavior.</jc></span> |
| <span class="source-line-no">639</span><span id="line-639"> * BeanContext <jv>context</jv> = BeanContext</span> |
| <span class="source-line-no">640</span><span id="line-640"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">641</span><span id="line-641"> * .beanMapPutReturnsOldValue()</span> |
| <span class="source-line-no">642</span><span id="line-642"> * .build();</span> |
| <span class="source-line-no">643</span><span id="line-643"> *</span> |
| <span class="source-line-no">644</span><span id="line-644"> * BeanMap&lt;MyBean&gt; <jv>myBeanMap</jv> = <jv>context</jv>.createSession().toBeanMap(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">645</span><span id="line-645"> * <jv>myBeanMap</jv>.put(<js>"foo"</js>, <js>"bar"</js>);</span> |
| <span class="source-line-no">646</span><span id="line-646"> * Object <jv>oldValue</jv> = <jv>myBeanMap</jv>.put(<js>"foo"</js>, <js>"baz"</js>); <jc>// oldValue == "bar"</jc></span> |
| <span class="source-line-no">647</span><span id="line-647"> * </p></span> |
| <span class="source-line-no">648</span><span id="line-648"> *</span> |
| <span class="source-line-no">649</span><span id="line-649"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">650</span><span id="line-650"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#beanMapPutReturnsOldValue()}</span> |
| <span class="source-line-no">651</span><span id="line-651"> * </ul></span> |
| <span class="source-line-no">652</span><span id="line-652"> *</span> |
| <span class="source-line-no">653</span><span id="line-653"> * @return This object.</span> |
| <span class="source-line-no">654</span><span id="line-654"> */</span> |
| <span class="source-line-no">655</span><span id="line-655"> @FluentSetter</span> |
| <span class="source-line-no">656</span><span id="line-656"> public Builder beanMapPutReturnsOldValue() {</span> |
| <span class="source-line-no">657</span><span id="line-657"> return beanMapPutReturnsOldValue(true);</span> |
| <span class="source-line-no">658</span><span id="line-658"> }</span> |
| <span class="source-line-no">659</span><span id="line-659"></span> |
| <span class="source-line-no">660</span><span id="line-660"> /**</span> |
| <span class="source-line-no">661</span><span id="line-661"> * Same as {@link #beanMapPutReturnsOldValue()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">662</span><span id="line-662"> *</span> |
| <span class="source-line-no">663</span><span id="line-663"> * @param value The value for this setting.</span> |
| <span class="source-line-no">664</span><span id="line-664"> * @return This object.</span> |
| <span class="source-line-no">665</span><span id="line-665"> */</span> |
| <span class="source-line-no">666</span><span id="line-666"> @FluentSetter</span> |
| <span class="source-line-no">667</span><span id="line-667"> public Builder beanMapPutReturnsOldValue(boolean value) {</span> |
| <span class="source-line-no">668</span><span id="line-668"> beanMapPutReturnsOldValue = value;</span> |
| <span class="source-line-no">669</span><span id="line-669"> return this;</span> |
| <span class="source-line-no">670</span><span id="line-670"> }</span> |
| <span class="source-line-no">671</span><span id="line-671"></span> |
| <span class="source-line-no">672</span><span id="line-672"> /**</span> |
| <span class="source-line-no">673</span><span id="line-673"> * Minimum bean method visibility.</span> |
| <span class="source-line-no">674</span><span id="line-674"> *</span> |
| <span class="source-line-no">675</span><span id="line-675"> * <p></span> |
| <span class="source-line-no">676</span><span id="line-676"> * Only look for bean methods with the specified minimum visibility.</span> |
| <span class="source-line-no">677</span><span id="line-677"> *</span> |
| <span class="source-line-no">678</span><span id="line-678"> * <p></span> |
| <span class="source-line-no">679</span><span id="line-679"> * This affects which methods are detected as getters and setters on a bean class. Normally only <jk>public</jk> getters and setters are considered.</span> |
| <span class="source-line-no">680</span><span id="line-680"> * Use this setting if you want to reduce the visibility requirement.</span> |
| <span class="source-line-no">681</span><span id="line-681"> *</span> |
| <span class="source-line-no">682</span><span id="line-682"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">683</span><span id="line-683"> * <p class='bjava'></span> |
| <span class="source-line-no">684</span><span id="line-684"> * <jc>// A bean with a protected getter.</jc></span> |
| <span class="source-line-no">685</span><span id="line-685"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">686</span><span id="line-686"> * <jk>public</jk> String getFoo() { <jk>return</jk> <js>"foo"</js>; }</span> |
| <span class="source-line-no">687</span><span id="line-687"> * <jk>protected</jk> String getBar() { <jk>return</jk> <js>"bar"</js>; }</span> |
| <span class="source-line-no">688</span><span id="line-688"> * }</span> |
| <span class="source-line-no">689</span><span id="line-689"> *</span> |
| <span class="source-line-no">690</span><span id="line-690"> * <jc>// Create a serializer that looks for protected getters and setters.</jc></span> |
| <span class="source-line-no">691</span><span id="line-691"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">692</span><span id="line-692"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">693</span><span id="line-693"> * .beanMethodVisibility(<jsf>PROTECTED</jsf>)</span> |
| <span class="source-line-no">694</span><span id="line-694"> * .build();</span> |
| <span class="source-line-no">695</span><span id="line-695"> *</span> |
| <span class="source-line-no">696</span><span id="line-696"> * <jc>// Produces: {"foo":"foo","bar":"bar"}</jc></span> |
| <span class="source-line-no">697</span><span id="line-697"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">698</span><span id="line-698"> * </p></span> |
| <span class="source-line-no">699</span><span id="line-699"> *</span> |
| <span class="source-line-no">700</span><span id="line-700"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">701</span><span id="line-701"> * <li class='note'>The {@link Beanp @Beanp} annotation can also be used to expose a non-public method.</span> |
| <span class="source-line-no">702</span><span id="line-702"> * <li class='note'>The {@link BeanIgnore @BeanIgnore} annotation can also be used on a public bean getter/setter to ignore it as a bean property.</span> |
| <span class="source-line-no">703</span><span id="line-703"> * </ul></span> |
| <span class="source-line-no">704</span><span id="line-704"> *</span> |
| <span class="source-line-no">705</span><span id="line-705"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">706</span><span id="line-706"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#beanMethodVisibility()}</span> |
| <span class="source-line-no">707</span><span id="line-707"> * </ul></span> |
| <span class="source-line-no">708</span><span id="line-708"> *</span> |
| <span class="source-line-no">709</span><span id="line-709"> * @param value</span> |
| <span class="source-line-no">710</span><span id="line-710"> * The new value for this setting.</span> |
| <span class="source-line-no">711</span><span id="line-711"> * <br>The default is {@link Visibility#PUBLIC}</span> |
| <span class="source-line-no">712</span><span id="line-712"> * @return This object.</span> |
| <span class="source-line-no">713</span><span id="line-713"> */</span> |
| <span class="source-line-no">714</span><span id="line-714"> @FluentSetter</span> |
| <span class="source-line-no">715</span><span id="line-715"> public Builder beanMethodVisibility(Visibility value) {</span> |
| <span class="source-line-no">716</span><span id="line-716"> beanMethodVisibility = value;</span> |
| <span class="source-line-no">717</span><span id="line-717"> return this;</span> |
| <span class="source-line-no">718</span><span id="line-718"> }</span> |
| <span class="source-line-no">719</span><span id="line-719"></span> |
| <span class="source-line-no">720</span><span id="line-720"> /**</span> |
| <span class="source-line-no">721</span><span id="line-721"> * Beans require no-arg constructors.</span> |
| <span class="source-line-no">722</span><span id="line-722"> *</span> |
| <span class="source-line-no">723</span><span id="line-723"> * <p></span> |
| <span class="source-line-no">724</span><span id="line-724"> * When enabled, a Java class must implement a default no-arg constructor to be considered a bean.</span> |
| <span class="source-line-no">725</span><span id="line-725"> * Otherwise, the bean will be serialized as a string using the {@link Object#toString()} method.</span> |
| <span class="source-line-no">726</span><span id="line-726"> *</span> |
| <span class="source-line-no">727</span><span id="line-727"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">728</span><span id="line-728"> * <p class='bjava'></span> |
| <span class="source-line-no">729</span><span id="line-729"> * <jc>// A bean without a no-arg constructor.</jc></span> |
| <span class="source-line-no">730</span><span id="line-730"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">731</span><span id="line-731"> *</span> |
| <span class="source-line-no">732</span><span id="line-732"> * <jc>// A property method.</jc></span> |
| <span class="source-line-no">733</span><span id="line-733"> * <jk>public</jk> String <jf>foo</jf> = <js>"bar"</js>;</span> |
| <span class="source-line-no">734</span><span id="line-734"> *</span> |
| <span class="source-line-no">735</span><span id="line-735"> * <jc>// A no-arg constructor</jc></span> |
| <span class="source-line-no">736</span><span id="line-736"> * <jk>public</jk> MyBean(String <jv>foo</jv>) {</span> |
| <span class="source-line-no">737</span><span id="line-737"> * <jk>this</jk>.<jf>foo</jf> = <jv>foo</jv>;</span> |
| <span class="source-line-no">738</span><span id="line-738"> * }</span> |
| <span class="source-line-no">739</span><span id="line-739"> *</span> |
| <span class="source-line-no">740</span><span id="line-740"> * <ja>@Override</ja></span> |
| <span class="source-line-no">741</span><span id="line-741"> * <jk>public</jk> String toString() {</span> |
| <span class="source-line-no">742</span><span id="line-742"> * <jk>return</jk> <js>"bar"</js>;</span> |
| <span class="source-line-no">743</span><span id="line-743"> * }</span> |
| <span class="source-line-no">744</span><span id="line-744"> * }</span> |
| <span class="source-line-no">745</span><span id="line-745"> *</span> |
| <span class="source-line-no">746</span><span id="line-746"> * <jc>// Create a serializer that ignores beans without default constructors.</jc></span> |
| <span class="source-line-no">747</span><span id="line-747"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">748</span><span id="line-748"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">749</span><span id="line-749"> * .beansRequireDefaultConstructor()</span> |
| <span class="source-line-no">750</span><span id="line-750"> * .build();</span> |
| <span class="source-line-no">751</span><span id="line-751"> *</span> |
| <span class="source-line-no">752</span><span id="line-752"> * <jc>// Produces: "bar"</jc></span> |
| <span class="source-line-no">753</span><span id="line-753"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">754</span><span id="line-754"> * </p></span> |
| <span class="source-line-no">755</span><span id="line-755"> *</span> |
| <span class="source-line-no">756</span><span id="line-756"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">757</span><span id="line-757"> * <li class='note'>The {@link Bean @Bean} annotation can be used on a bean class to override this setting.</span> |
| <span class="source-line-no">758</span><span id="line-758"> * <li class='note'>The {@link BeanIgnore @BeanIgnore} annotation can also be used on a class to ignore it as a bean.</span> |
| <span class="source-line-no">759</span><span id="line-759"> * </ul></span> |
| <span class="source-line-no">760</span><span id="line-760"> *</span> |
| <span class="source-line-no">761</span><span id="line-761"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">762</span><span id="line-762"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#beansRequireDefaultConstructor()}</span> |
| <span class="source-line-no">763</span><span id="line-763"> * </ul></span> |
| <span class="source-line-no">764</span><span id="line-764"> *</span> |
| <span class="source-line-no">765</span><span id="line-765"> * @return This object.</span> |
| <span class="source-line-no">766</span><span id="line-766"> */</span> |
| <span class="source-line-no">767</span><span id="line-767"> @FluentSetter</span> |
| <span class="source-line-no">768</span><span id="line-768"> public Builder beansRequireDefaultConstructor() {</span> |
| <span class="source-line-no">769</span><span id="line-769"> return beansRequireDefaultConstructor(true);</span> |
| <span class="source-line-no">770</span><span id="line-770"> }</span> |
| <span class="source-line-no">771</span><span id="line-771"></span> |
| <span class="source-line-no">772</span><span id="line-772"> /**</span> |
| <span class="source-line-no">773</span><span id="line-773"> * Same as {@link #beansRequireDefaultConstructor()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">774</span><span id="line-774"> *</span> |
| <span class="source-line-no">775</span><span id="line-775"> * @param value The value for this setting.</span> |
| <span class="source-line-no">776</span><span id="line-776"> * @return This object.</span> |
| <span class="source-line-no">777</span><span id="line-777"> */</span> |
| <span class="source-line-no">778</span><span id="line-778"> @FluentSetter</span> |
| <span class="source-line-no">779</span><span id="line-779"> public Builder beansRequireDefaultConstructor(boolean value) {</span> |
| <span class="source-line-no">780</span><span id="line-780"> beansRequireDefaultConstructor = value;</span> |
| <span class="source-line-no">781</span><span id="line-781"> return this;</span> |
| <span class="source-line-no">782</span><span id="line-782"> }</span> |
| <span class="source-line-no">783</span><span id="line-783"></span> |
| <span class="source-line-no">784</span><span id="line-784"> /**</span> |
| <span class="source-line-no">785</span><span id="line-785"> * Beans require Serializable interface.</span> |
| <span class="source-line-no">786</span><span id="line-786"> *</span> |
| <span class="source-line-no">787</span><span id="line-787"> * <p></span> |
| <span class="source-line-no">788</span><span id="line-788"> * When enabled, a Java class must implement the {@link Serializable} interface to be considered a bean.</span> |
| <span class="source-line-no">789</span><span id="line-789"> * Otherwise, the bean will be serialized as a string using the {@link Object#toString()} method.</span> |
| <span class="source-line-no">790</span><span id="line-790"> *</span> |
| <span class="source-line-no">791</span><span id="line-791"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">792</span><span id="line-792"> * <p class='bjava'></span> |
| <span class="source-line-no">793</span><span id="line-793"> * <jc>// A bean without a Serializable interface.</jc></span> |
| <span class="source-line-no">794</span><span id="line-794"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">795</span><span id="line-795"> *</span> |
| <span class="source-line-no">796</span><span id="line-796"> * <jc>// A property method.</jc></span> |
| <span class="source-line-no">797</span><span id="line-797"> * <jk>public</jk> String <jf>foo</jf> = <js>"bar"</js>;</span> |
| <span class="source-line-no">798</span><span id="line-798"> *</span> |
| <span class="source-line-no">799</span><span id="line-799"> * <ja>@Override</ja></span> |
| <span class="source-line-no">800</span><span id="line-800"> * <jk>public</jk> String toString() {</span> |
| <span class="source-line-no">801</span><span id="line-801"> * <jk>return</jk> <js>"bar"</js>;</span> |
| <span class="source-line-no">802</span><span id="line-802"> * }</span> |
| <span class="source-line-no">803</span><span id="line-803"> * }</span> |
| <span class="source-line-no">804</span><span id="line-804"> *</span> |
| <span class="source-line-no">805</span><span id="line-805"> * <jc>// Create a serializer that ignores beans not implementing Serializable.</jc></span> |
| <span class="source-line-no">806</span><span id="line-806"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">807</span><span id="line-807"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">808</span><span id="line-808"> * .beansRequireSerializable()</span> |
| <span class="source-line-no">809</span><span id="line-809"> * .build();</span> |
| <span class="source-line-no">810</span><span id="line-810"> *</span> |
| <span class="source-line-no">811</span><span id="line-811"> * <jc>// Produces: "bar"</jc></span> |
| <span class="source-line-no">812</span><span id="line-812"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">813</span><span id="line-813"> * </p></span> |
| <span class="source-line-no">814</span><span id="line-814"> *</span> |
| <span class="source-line-no">815</span><span id="line-815"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">816</span><span id="line-816"> * <li class='note'>The {@link Bean @Bean} annotation can be used on a bean class to override this setting.</span> |
| <span class="source-line-no">817</span><span id="line-817"> * <li class='note'>The {@link BeanIgnore @BeanIgnore} annotation can also be used on a class to ignore it as a bean.</span> |
| <span class="source-line-no">818</span><span id="line-818"> * </ul></span> |
| <span class="source-line-no">819</span><span id="line-819"> *</span> |
| <span class="source-line-no">820</span><span id="line-820"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">821</span><span id="line-821"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#beansRequireSerializable()}</span> |
| <span class="source-line-no">822</span><span id="line-822"> * </ul></span> |
| <span class="source-line-no">823</span><span id="line-823"> *</span> |
| <span class="source-line-no">824</span><span id="line-824"> * @return This object.</span> |
| <span class="source-line-no">825</span><span id="line-825"> */</span> |
| <span class="source-line-no">826</span><span id="line-826"> @FluentSetter</span> |
| <span class="source-line-no">827</span><span id="line-827"> public Builder beansRequireSerializable() {</span> |
| <span class="source-line-no">828</span><span id="line-828"> return beansRequireSerializable(true);</span> |
| <span class="source-line-no">829</span><span id="line-829"> }</span> |
| <span class="source-line-no">830</span><span id="line-830"></span> |
| <span class="source-line-no">831</span><span id="line-831"> /**</span> |
| <span class="source-line-no">832</span><span id="line-832"> * Same as {@link #beansRequireSerializable()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">833</span><span id="line-833"> *</span> |
| <span class="source-line-no">834</span><span id="line-834"> * @param value The value for this setting.</span> |
| <span class="source-line-no">835</span><span id="line-835"> * @return This object.</span> |
| <span class="source-line-no">836</span><span id="line-836"> */</span> |
| <span class="source-line-no">837</span><span id="line-837"> @FluentSetter</span> |
| <span class="source-line-no">838</span><span id="line-838"> public Builder beansRequireSerializable(boolean value) {</span> |
| <span class="source-line-no">839</span><span id="line-839"> beansRequireSerializable = value;</span> |
| <span class="source-line-no">840</span><span id="line-840"> return this;</span> |
| <span class="source-line-no">841</span><span id="line-841"> }</span> |
| <span class="source-line-no">842</span><span id="line-842"></span> |
| <span class="source-line-no">843</span><span id="line-843"> /**</span> |
| <span class="source-line-no">844</span><span id="line-844"> * Beans require setters for getters.</span> |
| <span class="source-line-no">845</span><span id="line-845"> *</span> |
| <span class="source-line-no">846</span><span id="line-846"> * <p></span> |
| <span class="source-line-no">847</span><span id="line-847"> * When enabled, ignore read-only properties (properties with getters but not setters).</span> |
| <span class="source-line-no">848</span><span id="line-848"> *</span> |
| <span class="source-line-no">849</span><span id="line-849"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">850</span><span id="line-850"> * <p class='bjava'></span> |
| <span class="source-line-no">851</span><span id="line-851"> * <jc>// A bean without a Serializable interface.</jc></span> |
| <span class="source-line-no">852</span><span id="line-852"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">853</span><span id="line-853"> *</span> |
| <span class="source-line-no">854</span><span id="line-854"> * <jc>// A read/write property.</jc></span> |
| <span class="source-line-no">855</span><span id="line-855"> * <jk>public</jk> String getFoo() { <jk>return</jk> <js>"foo"</js>; }</span> |
| <span class="source-line-no">856</span><span id="line-856"> * <jk>public void</jk> setFoo(String <jv>foo</jv>) { ... }</span> |
| <span class="source-line-no">857</span><span id="line-857"> *</span> |
| <span class="source-line-no">858</span><span id="line-858"> * <jc>// A read-only property.</jc></span> |
| <span class="source-line-no">859</span><span id="line-859"> * <jk>public</jk> String getBar() { <jk>return</jk> <js>"bar"</js>; }</span> |
| <span class="source-line-no">860</span><span id="line-860"> * }</span> |
| <span class="source-line-no">861</span><span id="line-861"> *</span> |
| <span class="source-line-no">862</span><span id="line-862"> * <jc>// Create a serializer that ignores bean properties without setters.</jc></span> |
| <span class="source-line-no">863</span><span id="line-863"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">864</span><span id="line-864"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">865</span><span id="line-865"> * .beansRequireSettersForGetters()</span> |
| <span class="source-line-no">866</span><span id="line-866"> * .build();</span> |
| <span class="source-line-no">867</span><span id="line-867"> *</span> |
| <span class="source-line-no">868</span><span id="line-868"> * <jc>// Produces: {"foo":"foo"}</jc></span> |
| <span class="source-line-no">869</span><span id="line-869"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">870</span><span id="line-870"> * </p></span> |
| <span class="source-line-no">871</span><span id="line-871"> *</span> |
| <span class="source-line-no">872</span><span id="line-872"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">873</span><span id="line-873"> * <li class='note'>The {@link Beanp @Beanp} annotation can be used on the getter to override this setting.</span> |
| <span class="source-line-no">874</span><span id="line-874"> * <li class='note'>The {@link BeanIgnore @BeanIgnore} annotation can also be used on getters to ignore them as bean properties.</span> |
| <span class="source-line-no">875</span><span id="line-875"> * </ul></span> |
| <span class="source-line-no">876</span><span id="line-876"> *</span> |
| <span class="source-line-no">877</span><span id="line-877"> * @return This object.</span> |
| <span class="source-line-no">878</span><span id="line-878"> */</span> |
| <span class="source-line-no">879</span><span id="line-879"> @FluentSetter</span> |
| <span class="source-line-no">880</span><span id="line-880"> public Builder beansRequireSettersForGetters() {</span> |
| <span class="source-line-no">881</span><span id="line-881"> return beansRequireSettersForGetters(true);</span> |
| <span class="source-line-no">882</span><span id="line-882"> }</span> |
| <span class="source-line-no">883</span><span id="line-883"></span> |
| <span class="source-line-no">884</span><span id="line-884"> /**</span> |
| <span class="source-line-no">885</span><span id="line-885"> * Same as {@link #beansRequireSettersForGetters()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">886</span><span id="line-886"> *</span> |
| <span class="source-line-no">887</span><span id="line-887"> * @param value The value for this setting.</span> |
| <span class="source-line-no">888</span><span id="line-888"> * @return This object.</span> |
| <span class="source-line-no">889</span><span id="line-889"> */</span> |
| <span class="source-line-no">890</span><span id="line-890"> @FluentSetter</span> |
| <span class="source-line-no">891</span><span id="line-891"> public Builder beansRequireSettersForGetters(boolean value) {</span> |
| <span class="source-line-no">892</span><span id="line-892"> beansRequireSettersForGetters = value;</span> |
| <span class="source-line-no">893</span><span id="line-893"> return this;</span> |
| <span class="source-line-no">894</span><span id="line-894"> }</span> |
| <span class="source-line-no">895</span><span id="line-895"></span> |
| <span class="source-line-no">896</span><span id="line-896"> /**</span> |
| <span class="source-line-no">897</span><span id="line-897"> * Beans don't require at least one property.</span> |
| <span class="source-line-no">898</span><span id="line-898"> *</span> |
| <span class="source-line-no">899</span><span id="line-899"> * <p></span> |
| <span class="source-line-no">900</span><span id="line-900"> * When enabled, then a Java class doesn't need to contain at least 1 property to be considered a bean.</span> |
| <span class="source-line-no">901</span><span id="line-901"> * Otherwise, the bean will be serialized as a string using the {@link Object#toString()} method.</span> |
| <span class="source-line-no">902</span><span id="line-902"> *</span> |
| <span class="source-line-no">903</span><span id="line-903"> * <p></span> |
| <span class="source-line-no">904</span><span id="line-904"> * The {@link Bean @Bean} annotation can be used on a class to override this setting when <jk>true</jk>.</span> |
| <span class="source-line-no">905</span><span id="line-905"> *</span> |
| <span class="source-line-no">906</span><span id="line-906"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">907</span><span id="line-907"> * <p class='bjava'></span> |
| <span class="source-line-no">908</span><span id="line-908"> * <jc>// A bean with no properties.</jc></span> |
| <span class="source-line-no">909</span><span id="line-909"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">910</span><span id="line-910"> * }</span> |
| <span class="source-line-no">911</span><span id="line-911"> *</span> |
| <span class="source-line-no">912</span><span id="line-912"> * <jc>// Create a serializer that serializes beans even if they have zero properties.</jc></span> |
| <span class="source-line-no">913</span><span id="line-913"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">914</span><span id="line-914"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">915</span><span id="line-915"> * .disableBeansRequireSomeProperties()</span> |
| <span class="source-line-no">916</span><span id="line-916"> * .build();</span> |
| <span class="source-line-no">917</span><span id="line-917"> *</span> |
| <span class="source-line-no">918</span><span id="line-918"> * <jc>// Produces: {}</jc></span> |
| <span class="source-line-no">919</span><span id="line-919"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">920</span><span id="line-920"> * </p></span> |
| <span class="source-line-no">921</span><span id="line-921"> *</span> |
| <span class="source-line-no">922</span><span id="line-922"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">923</span><span id="line-923"> * <li class='note'>The {@link Bean @Bean} annotation can be used on the class to force it to be recognized as a bean class</span> |
| <span class="source-line-no">924</span><span id="line-924"> * even if it has no properties.</span> |
| <span class="source-line-no">925</span><span id="line-925"> * </ul></span> |
| <span class="source-line-no">926</span><span id="line-926"> *</span> |
| <span class="source-line-no">927</span><span id="line-927"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">928</span><span id="line-928"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#disableBeansRequireSomeProperties()}</span> |
| <span class="source-line-no">929</span><span id="line-929"> * </ul></span> |
| <span class="source-line-no">930</span><span id="line-930"> *</span> |
| <span class="source-line-no">931</span><span id="line-931"> * @return This object.</span> |
| <span class="source-line-no">932</span><span id="line-932"> */</span> |
| <span class="source-line-no">933</span><span id="line-933"> @FluentSetter</span> |
| <span class="source-line-no">934</span><span id="line-934"> public Builder disableBeansRequireSomeProperties() {</span> |
| <span class="source-line-no">935</span><span id="line-935"> return disableBeansRequireSomeProperties(true);</span> |
| <span class="source-line-no">936</span><span id="line-936"> }</span> |
| <span class="source-line-no">937</span><span id="line-937"></span> |
| <span class="source-line-no">938</span><span id="line-938"> /**</span> |
| <span class="source-line-no">939</span><span id="line-939"> * Same as {@link #disableBeansRequireSomeProperties()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">940</span><span id="line-940"> *</span> |
| <span class="source-line-no">941</span><span id="line-941"> * @param value The value for this setting.</span> |
| <span class="source-line-no">942</span><span id="line-942"> * @return This object.</span> |
| <span class="source-line-no">943</span><span id="line-943"> */</span> |
| <span class="source-line-no">944</span><span id="line-944"> @FluentSetter</span> |
| <span class="source-line-no">945</span><span id="line-945"> public Builder disableBeansRequireSomeProperties(boolean value) {</span> |
| <span class="source-line-no">946</span><span id="line-946"> disableBeansRequireSomeProperties = value;</span> |
| <span class="source-line-no">947</span><span id="line-947"> return this;</span> |
| <span class="source-line-no">948</span><span id="line-948"> }</span> |
| <span class="source-line-no">949</span><span id="line-949"></span> |
| <span class="source-line-no">950</span><span id="line-950"> /**</span> |
| <span class="source-line-no">951</span><span id="line-951"> * Bean property includes.</span> |
| <span class="source-line-no">952</span><span id="line-952"> *</span> |
| <span class="source-line-no">953</span><span id="line-953"> * <p></span> |
| <span class="source-line-no">954</span><span id="line-954"> * Specifies the set and order of names of properties associated with the bean class.</span> |
| <span class="source-line-no">955</span><span id="line-955"> *</span> |
| <span class="source-line-no">956</span><span id="line-956"> * <p></span> |
| <span class="source-line-no">957</span><span id="line-957"> * For example, <c>beanProperties(MyBean.<jk>class</jk>, <js>"foo,bar"</js>)</c> means only serialize the <c>foo</c> and</span> |
| <span class="source-line-no">958</span><span id="line-958"> * <c>bar</c> properties on the specified bean. Likewise, parsing will ignore any bean properties not specified</span> |
| <span class="source-line-no">959</span><span id="line-959"> * and either throw an exception or silently ignore them depending on whether {@link #ignoreUnknownBeanProperties()}</span> |
| <span class="source-line-no">960</span><span id="line-960"> * has been called.</span> |
| <span class="source-line-no">961</span><span id="line-961"> *</span> |
| <span class="source-line-no">962</span><span id="line-962"> * <p></span> |
| <span class="source-line-no">963</span><span id="line-963"> * This value is entirely optional if you simply want to expose all the getters and public fields on</span> |
| <span class="source-line-no">964</span><span id="line-964"> * a class as bean properties. However, it's useful if you want certain getters to be ignored or you want the properties to be</span> |
| <span class="source-line-no">965</span><span id="line-965"> * serialized in a particular order. Note that on IBM JREs, the property order is the same as the order in the source code,</span> |
| <span class="source-line-no">966</span><span id="line-966"> * whereas on Oracle JREs, the order is entirely random.</span> |
| <span class="source-line-no">967</span><span id="line-967"> *</span> |
| <span class="source-line-no">968</span><span id="line-968"> * <p></span> |
| <span class="source-line-no">969</span><span id="line-969"> * Setting applies to specified class and all subclasses.</span> |
| <span class="source-line-no">970</span><span id="line-970"> *</span> |
| <span class="source-line-no">971</span><span id="line-971"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">972</span><span id="line-972"> * <p class='bjava'></span> |
| <span class="source-line-no">973</span><span id="line-973"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">974</span><span id="line-974"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">975</span><span id="line-975"> * <jk>public</jk> String</span> |
| <span class="source-line-no">976</span><span id="line-976"> * <jf>foo</jf> = <js>"foo"</js>,</span> |
| <span class="source-line-no">977</span><span id="line-977"> * <jf>bar</jf> = <js>"bar"</js>,</span> |
| <span class="source-line-no">978</span><span id="line-978"> * <jf>baz</jf> = <js>"baz"</js>;</span> |
| <span class="source-line-no">979</span><span id="line-979"> * }</span> |
| <span class="source-line-no">980</span><span id="line-980"> *</span> |
| <span class="source-line-no">981</span><span id="line-981"> * <jc>// Create a serializer that includes only the 'foo' and 'bar' properties on the MyBean class.</jc></span> |
| <span class="source-line-no">982</span><span id="line-982"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">983</span><span id="line-983"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">984</span><span id="line-984"> * .beanProperties(MyBean.<jk>class</jk>, <js>"foo,bar"</js>)</span> |
| <span class="source-line-no">985</span><span id="line-985"> * .build();</span> |
| <span class="source-line-no">986</span><span id="line-986"> *</span> |
| <span class="source-line-no">987</span><span id="line-987"> * <jc>// Produces: {"foo":"foo","bar":"bar"}</jc></span> |
| <span class="source-line-no">988</span><span id="line-988"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">989</span><span id="line-989"> * </p></span> |
| <span class="source-line-no">990</span><span id="line-990"> *</span> |
| <span class="source-line-no">991</span><span id="line-991"> * <p></span> |
| <span class="source-line-no">992</span><span id="line-992"> * This method is functionally equivalent to the following code:</span> |
| <span class="source-line-no">993</span><span id="line-993"> * <p class='bjava'></span> |
| <span class="source-line-no">994</span><span id="line-994"> * <jv>builder</jv>.annotations(BeanAnnotation.<jsm>create</jsm>(<jv>beanClass</jv>).properties(<jv>properties</jv>).build());</span> |
| <span class="source-line-no">995</span><span id="line-995"> * </p></span> |
| <span class="source-line-no">996</span><span id="line-996"> *</span> |
| <span class="source-line-no">997</span><span id="line-997"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">998</span><span id="line-998"> * <li class='jma'>{@link Bean#properties()}/{@link Bean#p()} - On an annotation on the bean class itself.</span> |
| <span class="source-line-no">999</span><span id="line-999"> * </ul></span> |
| <span class="source-line-no">1000</span><span id="line-1000"> *</span> |
| <span class="source-line-no">1001</span><span id="line-1001"> * @param beanClass The bean class.</span> |
| <span class="source-line-no">1002</span><span id="line-1002"> * @param properties Comma-delimited list of property names.</span> |
| <span class="source-line-no">1003</span><span id="line-1003"> * @return This object.</span> |
| <span class="source-line-no">1004</span><span id="line-1004"> */</span> |
| <span class="source-line-no">1005</span><span id="line-1005"> @FluentSetter</span> |
| <span class="source-line-no">1006</span><span id="line-1006"> public Builder beanProperties(Class<?> beanClass, String properties) {</span> |
| <span class="source-line-no">1007</span><span id="line-1007"> return annotations(BeanAnnotation.create(beanClass).p(properties).build());</span> |
| <span class="source-line-no">1008</span><span id="line-1008"> }</span> |
| <span class="source-line-no">1009</span><span id="line-1009"></span> |
| <span class="source-line-no">1010</span><span id="line-1010"> /**</span> |
| <span class="source-line-no">1011</span><span id="line-1011"> * Bean property includes.</span> |
| <span class="source-line-no">1012</span><span id="line-1012"> *</span> |
| <span class="source-line-no">1013</span><span id="line-1013"> * <p></span> |
| <span class="source-line-no">1014</span><span id="line-1014"> * Specifies the set and order of names of properties associated with bean classes.</span> |
| <span class="source-line-no">1015</span><span id="line-1015"> *</span> |
| <span class="source-line-no">1016</span><span id="line-1016"> * <p></span> |
| <span class="source-line-no">1017</span><span id="line-1017"> * For example, <c>beanProperties(AMap.<jsm>of</jsm>(<js>"MyBean"</js>, <js>"foo,bar"</js>))</c> means only serialize the <c>foo</c> and</span> |
| <span class="source-line-no">1018</span><span id="line-1018"> * <c>bar</c> properties on the specified bean. Likewise, parsing will ignore any bean properties not specified</span> |
| <span class="source-line-no">1019</span><span id="line-1019"> * and either throw an exception or silently ignore them depending on whether {@link #ignoreUnknownBeanProperties()}</span> |
| <span class="source-line-no">1020</span><span id="line-1020"> * has been called.</span> |
| <span class="source-line-no">1021</span><span id="line-1021"> *</span> |
| <span class="source-line-no">1022</span><span id="line-1022"> * <p></span> |
| <span class="source-line-no">1023</span><span id="line-1023"> * This value is entirely optional if you simply want to expose all the getters and public fields on</span> |
| <span class="source-line-no">1024</span><span id="line-1024"> * a class as bean properties. However, it's useful if you want certain getters to be ignored or you want the properties to be</span> |
| <span class="source-line-no">1025</span><span id="line-1025"> * serialized in a particular order. Note that on IBM JREs, the property order is the same as the order in the source code,</span> |
| <span class="source-line-no">1026</span><span id="line-1026"> * whereas on Oracle JREs, the order is entirely random.</span> |
| <span class="source-line-no">1027</span><span id="line-1027"> *</span> |
| <span class="source-line-no">1028</span><span id="line-1028"> * <p></span> |
| <span class="source-line-no">1029</span><span id="line-1029"> * Setting applies to specified class and all subclasses.</span> |
| <span class="source-line-no">1030</span><span id="line-1030"> *</span> |
| <span class="source-line-no">1031</span><span id="line-1031"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1032</span><span id="line-1032"> * <p class='bjava'></span> |
| <span class="source-line-no">1033</span><span id="line-1033"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">1034</span><span id="line-1034"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1035</span><span id="line-1035"> * <jk>public</jk> String</span> |
| <span class="source-line-no">1036</span><span id="line-1036"> * <jf>foo</jf> = <js>"foo"</js>,</span> |
| <span class="source-line-no">1037</span><span id="line-1037"> * <jf>bar</jf> = <js>"bar"</js>,</span> |
| <span class="source-line-no">1038</span><span id="line-1038"> * <jf>baz</jf> = <js>"baz"</js>;</span> |
| <span class="source-line-no">1039</span><span id="line-1039"> * }</span> |
| <span class="source-line-no">1040</span><span id="line-1040"> *</span> |
| <span class="source-line-no">1041</span><span id="line-1041"> * <jc>// Create a serializer that includes only the 'foo' and 'bar' properties on the MyBean class.</jc></span> |
| <span class="source-line-no">1042</span><span id="line-1042"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1043</span><span id="line-1043"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1044</span><span id="line-1044"> * .beanProperties(AMap.<jsm>of</jsm>(<js>"MyBean"</js>, <js>"foo,bar"</js>))</span> |
| <span class="source-line-no">1045</span><span id="line-1045"> * .build();</span> |
| <span class="source-line-no">1046</span><span id="line-1046"> *</span> |
| <span class="source-line-no">1047</span><span id="line-1047"> * <jc>// Produces: {"foo":"foo","bar":"bar"}</jc></span> |
| <span class="source-line-no">1048</span><span id="line-1048"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">1049</span><span id="line-1049"> * </p></span> |
| <span class="source-line-no">1050</span><span id="line-1050"> *</span> |
| <span class="source-line-no">1051</span><span id="line-1051"> * <p></span> |
| <span class="source-line-no">1052</span><span id="line-1052"> * This method is functionally equivalent to the following code for each entry:</span> |
| <span class="source-line-no">1053</span><span id="line-1053"> * <p class='bjava'></span> |
| <span class="source-line-no">1054</span><span id="line-1054"> * <jv>builder</jv>.annotations(BeanAnnotation.<jsm>create</jsm>(<jv>key</jv>).properties(<jv>value</jv>.toString()).build());</span> |
| <span class="source-line-no">1055</span><span id="line-1055"> * </p></span> |
| <span class="source-line-no">1056</span><span id="line-1056"> *</span> |
| <span class="source-line-no">1057</span><span id="line-1057"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1058</span><span id="line-1058"> * <li class='jma'>{@link Bean#properties()} / {@link Bean#p()}- On an annotation on the bean class itself.</span> |
| <span class="source-line-no">1059</span><span id="line-1059"> * </ul></span> |
| <span class="source-line-no">1060</span><span id="line-1060"> *</span> |
| <span class="source-line-no">1061</span><span id="line-1061"> * @param values</span> |
| <span class="source-line-no">1062</span><span id="line-1062"> * The values to add to this builder.</span> |
| <span class="source-line-no">1063</span><span id="line-1063"> * <br>Keys are bean class names which can be a simple name, fully-qualified name, or <js>"*"</js> for all beans.</span> |
| <span class="source-line-no">1064</span><span id="line-1064"> * <br>Values are comma-delimited lists of property names. Non-String objects are first converted to Strings.</span> |
| <span class="source-line-no">1065</span><span id="line-1065"> * @return This object.</span> |
| <span class="source-line-no">1066</span><span id="line-1066"> */</span> |
| <span class="source-line-no">1067</span><span id="line-1067"> @FluentSetter</span> |
| <span class="source-line-no">1068</span><span id="line-1068"> public Builder beanProperties(Map<String,Object> values) {</span> |
| <span class="source-line-no">1069</span><span id="line-1069"> values.forEach((k,v) -> annotations(BeanAnnotation.create(k).p(stringify(v)).build()));</span> |
| <span class="source-line-no">1070</span><span id="line-1070"> return this;</span> |
| <span class="source-line-no">1071</span><span id="line-1071"> }</span> |
| <span class="source-line-no">1072</span><span id="line-1072"></span> |
| <span class="source-line-no">1073</span><span id="line-1073"> /**</span> |
| <span class="source-line-no">1074</span><span id="line-1074"> * Bean property includes.</span> |
| <span class="source-line-no">1075</span><span id="line-1075"> *</span> |
| <span class="source-line-no">1076</span><span id="line-1076"> * <p></span> |
| <span class="source-line-no">1077</span><span id="line-1077"> * Specifies the set and order of names of properties associated with the bean class.</span> |
| <span class="source-line-no">1078</span><span id="line-1078"> *</span> |
| <span class="source-line-no">1079</span><span id="line-1079"> * <p></span> |
| <span class="source-line-no">1080</span><span id="line-1080"> * For example, <c>beanProperties(<js>"MyBean"</js>, <js>"foo,bar"</js>)</c> means only serialize the <c>foo</c> and</span> |
| <span class="source-line-no">1081</span><span id="line-1081"> * <c>bar</c> properties on the specified bean. Likewise, parsing will ignore any bean properties not specified</span> |
| <span class="source-line-no">1082</span><span id="line-1082"> * and either throw an exception or silently ignore them depending on whether {@link #ignoreUnknownBeanProperties()}</span> |
| <span class="source-line-no">1083</span><span id="line-1083"> * has been called.</span> |
| <span class="source-line-no">1084</span><span id="line-1084"> *</span> |
| <span class="source-line-no">1085</span><span id="line-1085"> * <p></span> |
| <span class="source-line-no">1086</span><span id="line-1086"> * This value is entirely optional if you simply want to expose all the getters and public fields on</span> |
| <span class="source-line-no">1087</span><span id="line-1087"> * a class as bean properties. However, it's useful if you want certain getters to be ignored or you want the properties to be</span> |
| <span class="source-line-no">1088</span><span id="line-1088"> * serialized in a particular order. Note that on IBM JREs, the property order is the same as the order in the source code,</span> |
| <span class="source-line-no">1089</span><span id="line-1089"> * whereas on Oracle JREs, the order is entirely random.</span> |
| <span class="source-line-no">1090</span><span id="line-1090"> *</span> |
| <span class="source-line-no">1091</span><span id="line-1091"> * <p></span> |
| <span class="source-line-no">1092</span><span id="line-1092"> * Setting applies to specified class and all subclasses.</span> |
| <span class="source-line-no">1093</span><span id="line-1093"> *</span> |
| <span class="source-line-no">1094</span><span id="line-1094"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1095</span><span id="line-1095"> * <p class='bjava'></span> |
| <span class="source-line-no">1096</span><span id="line-1096"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">1097</span><span id="line-1097"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1098</span><span id="line-1098"> * <jk>public</jk> String</span> |
| <span class="source-line-no">1099</span><span id="line-1099"> * <jf>foo</jf> = <js>"foo"</js>,</span> |
| <span class="source-line-no">1100</span><span id="line-1100"> * <jf>bar</jf> = <js>"bar"</js>,</span> |
| <span class="source-line-no">1101</span><span id="line-1101"> * <jf>baz</jf> = <js>"baz"</js>;</span> |
| <span class="source-line-no">1102</span><span id="line-1102"> * }</span> |
| <span class="source-line-no">1103</span><span id="line-1103"> *</span> |
| <span class="source-line-no">1104</span><span id="line-1104"> * <jc>// Create a serializer that includes only the 'foo' and 'bar' properties on the MyBean class.</jc></span> |
| <span class="source-line-no">1105</span><span id="line-1105"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1106</span><span id="line-1106"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1107</span><span id="line-1107"> * .beanProperties(<js>"MyBean"</js>, <js>"foo,bar"</js>)</span> |
| <span class="source-line-no">1108</span><span id="line-1108"> * .build();</span> |
| <span class="source-line-no">1109</span><span id="line-1109"> *</span> |
| <span class="source-line-no">1110</span><span id="line-1110"> * <jc>// Produces: {"foo":"foo","bar":"bar"}</jc></span> |
| <span class="source-line-no">1111</span><span id="line-1111"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">1112</span><span id="line-1112"> * </p></span> |
| <span class="source-line-no">1113</span><span id="line-1113"> *</span> |
| <span class="source-line-no">1114</span><span id="line-1114"> * <p></span> |
| <span class="source-line-no">1115</span><span id="line-1115"> * This method is functionally equivalent to the following code:</span> |
| <span class="source-line-no">1116</span><span id="line-1116"> * <p class='bjava'></span> |
| <span class="source-line-no">1117</span><span id="line-1117"> * <jv>builder</jv>.annotations(BeanAnnotation.<jsm>create</jsm>(<jv>beanClassName</jv>).properties(<jv>properties</jv>).build());</span> |
| <span class="source-line-no">1118</span><span id="line-1118"> * </p></span> |
| <span class="source-line-no">1119</span><span id="line-1119"> *</span> |
| <span class="source-line-no">1120</span><span id="line-1120"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1121</span><span id="line-1121"> * <li class='jma'>{@link Bean#properties()} / {@link Bean#p()} - On an annotation on the bean class itself.</span> |
| <span class="source-line-no">1122</span><span id="line-1122"> * </ul></span> |
| <span class="source-line-no">1123</span><span id="line-1123"> *</span> |
| <span class="source-line-no">1124</span><span id="line-1124"> * @param beanClassName</span> |
| <span class="source-line-no">1125</span><span id="line-1125"> * The bean class name.</span> |
| <span class="source-line-no">1126</span><span id="line-1126"> * <br>Can be a simple name, fully-qualified name, or <js>"*"</js> for all beans.</span> |
| <span class="source-line-no">1127</span><span id="line-1127"> * @param properties Comma-delimited list of property names.</span> |
| <span class="source-line-no">1128</span><span id="line-1128"> * @return This object.</span> |
| <span class="source-line-no">1129</span><span id="line-1129"> */</span> |
| <span class="source-line-no">1130</span><span id="line-1130"> @FluentSetter</span> |
| <span class="source-line-no">1131</span><span id="line-1131"> public Builder beanProperties(String beanClassName, String properties) {</span> |
| <span class="source-line-no">1132</span><span id="line-1132"> return annotations(BeanAnnotation.create(beanClassName).p(properties).build());</span> |
| <span class="source-line-no">1133</span><span id="line-1133"> }</span> |
| <span class="source-line-no">1134</span><span id="line-1134"></span> |
| <span class="source-line-no">1135</span><span id="line-1135"> /**</span> |
| <span class="source-line-no">1136</span><span id="line-1136"> * Bean property excludes.</span> |
| <span class="source-line-no">1137</span><span id="line-1137"> *</span> |
| <span class="source-line-no">1138</span><span id="line-1138"> * <p></span> |
| <span class="source-line-no">1139</span><span id="line-1139"> * Specifies to exclude the specified list of properties for the specified bean class.</span> |
| <span class="source-line-no">1140</span><span id="line-1140"> *</span> |
| <span class="source-line-no">1141</span><span id="line-1141"> * <p></span> |
| <span class="source-line-no">1142</span><span id="line-1142"> * Same as {@link #beanProperties(Class, String)} except you specify a list of bean property names that you want to exclude from</span> |
| <span class="source-line-no">1143</span><span id="line-1143"> * serialization.</span> |
| <span class="source-line-no">1144</span><span id="line-1144"> *</span> |
| <span class="source-line-no">1145</span><span id="line-1145"> * <p></span> |
| <span class="source-line-no">1146</span><span id="line-1146"> * Setting applies to specified class and all subclasses.</span> |
| <span class="source-line-no">1147</span><span id="line-1147"> *</span> |
| <span class="source-line-no">1148</span><span id="line-1148"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1149</span><span id="line-1149"> * <p class='bjava'></span> |
| <span class="source-line-no">1150</span><span id="line-1150"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">1151</span><span id="line-1151"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1152</span><span id="line-1152"> * <jk>public</jk> String</span> |
| <span class="source-line-no">1153</span><span id="line-1153"> * <jf>foo</jf> = <js>"foo"</js>,</span> |
| <span class="source-line-no">1154</span><span id="line-1154"> * <jf>bar</jf> = <js>"bar"</js>,</span> |
| <span class="source-line-no">1155</span><span id="line-1155"> * <jf>baz</jf> = <js>"baz"</js>;</span> |
| <span class="source-line-no">1156</span><span id="line-1156"> * }</span> |
| <span class="source-line-no">1157</span><span id="line-1157"> *</span> |
| <span class="source-line-no">1158</span><span id="line-1158"> * <jc>// Create a serializer that excludes the "bar" and "baz" properties on the MyBean class.</jc></span> |
| <span class="source-line-no">1159</span><span id="line-1159"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1160</span><span id="line-1160"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1161</span><span id="line-1161"> * .beanPropertiesExcludes(MyBean.<jk>class</jk>, <js>"bar,baz"</js>)</span> |
| <span class="source-line-no">1162</span><span id="line-1162"> * .build();</span> |
| <span class="source-line-no">1163</span><span id="line-1163"> *</span> |
| <span class="source-line-no">1164</span><span id="line-1164"> * <jc>// Produces: {"foo":"foo"}</jc></span> |
| <span class="source-line-no">1165</span><span id="line-1165"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">1166</span><span id="line-1166"> * </p></span> |
| <span class="source-line-no">1167</span><span id="line-1167"> *</span> |
| <span class="source-line-no">1168</span><span id="line-1168"> * <p></span> |
| <span class="source-line-no">1169</span><span id="line-1169"> * This method is functionally equivalent to the following code:</span> |
| <span class="source-line-no">1170</span><span id="line-1170"> * <p class='bjava'></span> |
| <span class="source-line-no">1171</span><span id="line-1171"> * <jv>builder</jv>.annotations(BeanAnnotation.<jsm>create</jsm>(<jv>beanClass</jv>).excludeProperties(<jv>properties</jv>).build());</span> |
| <span class="source-line-no">1172</span><span id="line-1172"> * </p></span> |
| <span class="source-line-no">1173</span><span id="line-1173"> *</span> |
| <span class="source-line-no">1174</span><span id="line-1174"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1175</span><span id="line-1175"> * <li class='jma'>{@link Bean#excludeProperties()} / {@link Bean#xp()}</span> |
| <span class="source-line-no">1176</span><span id="line-1176"> * </ul></span> |
| <span class="source-line-no">1177</span><span id="line-1177"> *</span> |
| <span class="source-line-no">1178</span><span id="line-1178"> * @param beanClass The bean class.</span> |
| <span class="source-line-no">1179</span><span id="line-1179"> * @param properties Comma-delimited list of property names.</span> |
| <span class="source-line-no">1180</span><span id="line-1180"> * @return This object.</span> |
| <span class="source-line-no">1181</span><span id="line-1181"> */</span> |
| <span class="source-line-no">1182</span><span id="line-1182"> @FluentSetter</span> |
| <span class="source-line-no">1183</span><span id="line-1183"> public Builder beanPropertiesExcludes(Class<?> beanClass, String properties) {</span> |
| <span class="source-line-no">1184</span><span id="line-1184"> return annotations(BeanAnnotation.create(beanClass).xp(properties).build());</span> |
| <span class="source-line-no">1185</span><span id="line-1185"> }</span> |
| <span class="source-line-no">1186</span><span id="line-1186"></span> |
| <span class="source-line-no">1187</span><span id="line-1187"> /**</span> |
| <span class="source-line-no">1188</span><span id="line-1188"> * Bean property excludes.</span> |
| <span class="source-line-no">1189</span><span id="line-1189"> *</span> |
| <span class="source-line-no">1190</span><span id="line-1190"> * <p></span> |
| <span class="source-line-no">1191</span><span id="line-1191"> * Specifies to exclude the specified list of properties for the specified bean classes.</span> |
| <span class="source-line-no">1192</span><span id="line-1192"> *</span> |
| <span class="source-line-no">1193</span><span id="line-1193"> * <p></span> |
| <span class="source-line-no">1194</span><span id="line-1194"> * Same as {@link #beanProperties(Map)} except you specify a list of bean property names that you want to exclude from</span> |
| <span class="source-line-no">1195</span><span id="line-1195"> * serialization.</span> |
| <span class="source-line-no">1196</span><span id="line-1196"> *</span> |
| <span class="source-line-no">1197</span><span id="line-1197"> * <p></span> |
| <span class="source-line-no">1198</span><span id="line-1198"> * Setting applies to specified class and all subclasses.</span> |
| <span class="source-line-no">1199</span><span id="line-1199"> *</span> |
| <span class="source-line-no">1200</span><span id="line-1200"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1201</span><span id="line-1201"> * <p class='bjava'></span> |
| <span class="source-line-no">1202</span><span id="line-1202"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">1203</span><span id="line-1203"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1204</span><span id="line-1204"> * <jk>public</jk> String</span> |
| <span class="source-line-no">1205</span><span id="line-1205"> * <jf>foo</jf> = <js>"foo"</js>,</span> |
| <span class="source-line-no">1206</span><span id="line-1206"> * <jf>bar</jf> = <js>"bar"</js>,</span> |
| <span class="source-line-no">1207</span><span id="line-1207"> * <jf>baz</jf> = <js>"baz"</js>;</span> |
| <span class="source-line-no">1208</span><span id="line-1208"> * }</span> |
| <span class="source-line-no">1209</span><span id="line-1209"> *</span> |
| <span class="source-line-no">1210</span><span id="line-1210"> * <jc>// Create a serializer that excludes the "bar" and "baz" properties on the MyBean class.</jc></span> |
| <span class="source-line-no">1211</span><span id="line-1211"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1212</span><span id="line-1212"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1213</span><span id="line-1213"> * .beanPropertiesExcludes(AMap.of(<js>"MyBean"</js>, <js>"bar,baz"</js>))</span> |
| <span class="source-line-no">1214</span><span id="line-1214"> * .build();</span> |
| <span class="source-line-no">1215</span><span id="line-1215"> *</span> |
| <span class="source-line-no">1216</span><span id="line-1216"> * <jc>// Produces: {"foo":"foo"}</jc></span> |
| <span class="source-line-no">1217</span><span id="line-1217"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">1218</span><span id="line-1218"> * </p></span> |
| <span class="source-line-no">1219</span><span id="line-1219"> *</span> |
| <span class="source-line-no">1220</span><span id="line-1220"> * <p></span> |
| <span class="source-line-no">1221</span><span id="line-1221"> * This method is functionally equivalent to the following code for each entry:</span> |
| <span class="source-line-no">1222</span><span id="line-1222"> * <p class='bjava'></span> |
| <span class="source-line-no">1223</span><span id="line-1223"> * <jv>builder</jv>.annotations(BeanAnnotation.<jsm>create</jsm>(<jv>key</jv>).excludeProperties(<jv>value</jv>.toString()).build());</span> |
| <span class="source-line-no">1224</span><span id="line-1224"> * </p></span> |
| <span class="source-line-no">1225</span><span id="line-1225"> *</span> |
| <span class="source-line-no">1226</span><span id="line-1226"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1227</span><span id="line-1227"> * <li class='jma'>{@link Bean#excludeProperties()} / {@link Bean#xp()}</span> |
| <span class="source-line-no">1228</span><span id="line-1228"> * </ul></span> |
| <span class="source-line-no">1229</span><span id="line-1229"> *</span> |
| <span class="source-line-no">1230</span><span id="line-1230"> * @param values</span> |
| <span class="source-line-no">1231</span><span id="line-1231"> * The values to add to this builder.</span> |
| <span class="source-line-no">1232</span><span id="line-1232"> * <br>Keys are bean class names which can be a simple name, fully-qualified name, or <js>"*"</js> for all beans.</span> |
| <span class="source-line-no">1233</span><span id="line-1233"> * <br>Values are comma-delimited lists of property names. Non-String objects are first converted to Strings.</span> |
| <span class="source-line-no">1234</span><span id="line-1234"> * @return This object.</span> |
| <span class="source-line-no">1235</span><span id="line-1235"> */</span> |
| <span class="source-line-no">1236</span><span id="line-1236"> @FluentSetter</span> |
| <span class="source-line-no">1237</span><span id="line-1237"> public Builder beanPropertiesExcludes(Map<String,Object> values) {</span> |
| <span class="source-line-no">1238</span><span id="line-1238"> values.forEach((k,v) -> annotations(BeanAnnotation.create(k).xp(stringify(v)).build()));</span> |
| <span class="source-line-no">1239</span><span id="line-1239"> return this;</span> |
| <span class="source-line-no">1240</span><span id="line-1240"> }</span> |
| <span class="source-line-no">1241</span><span id="line-1241"></span> |
| <span class="source-line-no">1242</span><span id="line-1242"> /**</span> |
| <span class="source-line-no">1243</span><span id="line-1243"> * Bean property excludes.</span> |
| <span class="source-line-no">1244</span><span id="line-1244"> *</span> |
| <span class="source-line-no">1245</span><span id="line-1245"> * <p></span> |
| <span class="source-line-no">1246</span><span id="line-1246"> * Specifies to exclude the specified list of properties for the specified bean class.</span> |
| <span class="source-line-no">1247</span><span id="line-1247"> *</span> |
| <span class="source-line-no">1248</span><span id="line-1248"> * <p></span> |
| <span class="source-line-no">1249</span><span id="line-1249"> * Same as {@link #beanPropertiesExcludes(String, String)} except you specify a list of bean property names that you want to exclude from</span> |
| <span class="source-line-no">1250</span><span id="line-1250"> * serialization.</span> |
| <span class="source-line-no">1251</span><span id="line-1251"> *</span> |
| <span class="source-line-no">1252</span><span id="line-1252"> * <p></span> |
| <span class="source-line-no">1253</span><span id="line-1253"> * Setting applies to specified class and all subclasses.</span> |
| <span class="source-line-no">1254</span><span id="line-1254"> *</span> |
| <span class="source-line-no">1255</span><span id="line-1255"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1256</span><span id="line-1256"> * <p class='bjava'></span> |
| <span class="source-line-no">1257</span><span id="line-1257"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">1258</span><span id="line-1258"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1259</span><span id="line-1259"> * <jk>public</jk> String</span> |
| <span class="source-line-no">1260</span><span id="line-1260"> * <jf>foo</jf> = <js>"foo"</js>,</span> |
| <span class="source-line-no">1261</span><span id="line-1261"> * <jf>bar</jf> = <js>"bar"</js>,</span> |
| <span class="source-line-no">1262</span><span id="line-1262"> * <jf>baz</jf> = <js>"baz"</js>;</span> |
| <span class="source-line-no">1263</span><span id="line-1263"> * }</span> |
| <span class="source-line-no">1264</span><span id="line-1264"> *</span> |
| <span class="source-line-no">1265</span><span id="line-1265"> * <jc>// Create a serializer that excludes the "bar" and "baz" properties on the MyBean class.</jc></span> |
| <span class="source-line-no">1266</span><span id="line-1266"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1267</span><span id="line-1267"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1268</span><span id="line-1268"> * .beanPropertiesExcludes(<js>"MyBean"</js>, <js>"bar,baz"</js>)</span> |
| <span class="source-line-no">1269</span><span id="line-1269"> * .build();</span> |
| <span class="source-line-no">1270</span><span id="line-1270"> *</span> |
| <span class="source-line-no">1271</span><span id="line-1271"> * <jc>// Produces: {"foo":"foo"}</jc></span> |
| <span class="source-line-no">1272</span><span id="line-1272"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">1273</span><span id="line-1273"> * </p></span> |
| <span class="source-line-no">1274</span><span id="line-1274"> *</span> |
| <span class="source-line-no">1275</span><span id="line-1275"> * <p></span> |
| <span class="source-line-no">1276</span><span id="line-1276"> * This method is functionally equivalent to the following code:</span> |
| <span class="source-line-no">1277</span><span id="line-1277"> * <p class='bjava'></span> |
| <span class="source-line-no">1278</span><span id="line-1278"> * <jv>builder</jv>.annotations(BeanAnnotation.<jsm>create</jsm>(<jv>beanClassName</jv>).excludeProperties(<jv>properties</jv>).build());</span> |
| <span class="source-line-no">1279</span><span id="line-1279"> * </p></span> |
| <span class="source-line-no">1280</span><span id="line-1280"> *</span> |
| <span class="source-line-no">1281</span><span id="line-1281"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1282</span><span id="line-1282"> * <li class='jma'>{@link Bean#excludeProperties()} / {@link Bean#xp()}</span> |
| <span class="source-line-no">1283</span><span id="line-1283"> * </ul></span> |
| <span class="source-line-no">1284</span><span id="line-1284"> *</span> |
| <span class="source-line-no">1285</span><span id="line-1285"> * @param beanClassName</span> |
| <span class="source-line-no">1286</span><span id="line-1286"> * The bean class name.</span> |
| <span class="source-line-no">1287</span><span id="line-1287"> * <br>Can be a simple name, fully-qualified name, or <js>"*"</js> for all bean classes.</span> |
| <span class="source-line-no">1288</span><span id="line-1288"> * @param properties Comma-delimited list of property names.</span> |
| <span class="source-line-no">1289</span><span id="line-1289"> * @return This object.</span> |
| <span class="source-line-no">1290</span><span id="line-1290"> */</span> |
| <span class="source-line-no">1291</span><span id="line-1291"> @FluentSetter</span> |
| <span class="source-line-no">1292</span><span id="line-1292"> public Builder beanPropertiesExcludes(String beanClassName, String properties) {</span> |
| <span class="source-line-no">1293</span><span id="line-1293"> return annotations(BeanAnnotation.create(beanClassName).xp(properties).build());</span> |
| <span class="source-line-no">1294</span><span id="line-1294"> }</span> |
| <span class="source-line-no">1295</span><span id="line-1295"></span> |
| <span class="source-line-no">1296</span><span id="line-1296"> /**</span> |
| <span class="source-line-no">1297</span><span id="line-1297"> * Read-only bean properties.</span> |
| <span class="source-line-no">1298</span><span id="line-1298"> *</span> |
| <span class="source-line-no">1299</span><span id="line-1299"> * <p></span> |
| <span class="source-line-no">1300</span><span id="line-1300"> * Specifies one or more properties on a bean that are read-only despite having valid getters.</span> |
| <span class="source-line-no">1301</span><span id="line-1301"> * Serializers will serialize such properties as usual, but parsers will silently ignore them.</span> |
| <span class="source-line-no">1302</span><span id="line-1302"> * Note that this is different from the {@link #beanProperties(Class,String) beanProperties}/{@link #beanPropertiesExcludes(Class,String) beanPropertiesExcludes} settings which include or exclude properties</span> |
| <span class="source-line-no">1303</span><span id="line-1303"> * for both serializers and parsers.</span> |
| <span class="source-line-no">1304</span><span id="line-1304"> *</span> |
| <span class="source-line-no">1305</span><span id="line-1305"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1306</span><span id="line-1306"> * <p class='bjava'></span> |
| <span class="source-line-no">1307</span><span id="line-1307"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">1308</span><span id="line-1308"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1309</span><span id="line-1309"> * <jk>public</jk> String <jf>foo</jf>, <jf>bar</jf>, <jf>baz</jf>;</span> |
| <span class="source-line-no">1310</span><span id="line-1310"> * }</span> |
| <span class="source-line-no">1311</span><span id="line-1311"> *</span> |
| <span class="source-line-no">1312</span><span id="line-1312"> * <jc>// Create a serializer with read-only property settings.</jc></span> |
| <span class="source-line-no">1313</span><span id="line-1313"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1314</span><span id="line-1314"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1315</span><span id="line-1315"> * .beanPropertiesReadOnly(MyBean.<jk>class</jk>, <js>"bar,baz"</js>)</span> |
| <span class="source-line-no">1316</span><span id="line-1316"> * .build();</span> |
| <span class="source-line-no">1317</span><span id="line-1317"> *</span> |
| <span class="source-line-no">1318</span><span id="line-1318"> * <jc>// All 3 properties will be serialized.</jc></span> |
| <span class="source-line-no">1319</span><span id="line-1319"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">1320</span><span id="line-1320"> *</span> |
| <span class="source-line-no">1321</span><span id="line-1321"> * <jc>// Create a parser with read-only property settings.</jc></span> |
| <span class="source-line-no">1322</span><span id="line-1322"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">1323</span><span id="line-1323"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1324</span><span id="line-1324"> * .beanPropertiesReadOnly(MyBean.<jk>class</jk>, <js>"bar,baz"</js>)</span> |
| <span class="source-line-no">1325</span><span id="line-1325"> * .ignoreUnknownBeanProperties()</span> |
| <span class="source-line-no">1326</span><span id="line-1326"> * .build();</span> |
| <span class="source-line-no">1327</span><span id="line-1327"> *</span> |
| <span class="source-line-no">1328</span><span id="line-1328"> * <jc>// Parser ignores bar and baz properties.</jc></span> |
| <span class="source-line-no">1329</span><span id="line-1329"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'foo',bar:'bar',baz:'baz'}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">1330</span><span id="line-1330"> * </p></span> |
| <span class="source-line-no">1331</span><span id="line-1331"> *</span> |
| <span class="source-line-no">1332</span><span id="line-1332"> * <p></span> |
| <span class="source-line-no">1333</span><span id="line-1333"> * This method is functionally equivalent to the following code:</span> |
| <span class="source-line-no">1334</span><span id="line-1334"> * <p class='bjava'></span> |
| <span class="source-line-no">1335</span><span id="line-1335"> * <jv>builder</jv>.annotations(BeanAnnotation.<jsm>create</jsm>(<jv>beanClass</jv>).readOnlyProperties(<jv>properties</jv>).build());</span> |
| <span class="source-line-no">1336</span><span id="line-1336"> * </p></span> |
| <span class="source-line-no">1337</span><span id="line-1337"> *</span> |
| <span class="source-line-no">1338</span><span id="line-1338"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1339</span><span id="line-1339"> * <li class='jma'>{@link Bean#readOnlyProperties()} / {@link Bean#ro()}</span> |
| <span class="source-line-no">1340</span><span id="line-1340"> * </ul></span> |
| <span class="source-line-no">1341</span><span id="line-1341"> *</span> |
| <span class="source-line-no">1342</span><span id="line-1342"> * @param beanClass The bean class.</span> |
| <span class="source-line-no">1343</span><span id="line-1343"> * @param properties Comma-delimited list of property names.</span> |
| <span class="source-line-no">1344</span><span id="line-1344"> * @return This object.</span> |
| <span class="source-line-no">1345</span><span id="line-1345"> */</span> |
| <span class="source-line-no">1346</span><span id="line-1346"> @FluentSetter</span> |
| <span class="source-line-no">1347</span><span id="line-1347"> public Builder beanPropertiesReadOnly(Class<?> beanClass, String properties) {</span> |
| <span class="source-line-no">1348</span><span id="line-1348"> return annotations(BeanAnnotation.create(beanClass).ro(properties).build());</span> |
| <span class="source-line-no">1349</span><span id="line-1349"> }</span> |
| <span class="source-line-no">1350</span><span id="line-1350"></span> |
| <span class="source-line-no">1351</span><span id="line-1351"> /**</span> |
| <span class="source-line-no">1352</span><span id="line-1352"> * Read-only bean properties.</span> |
| <span class="source-line-no">1353</span><span id="line-1353"> *</span> |
| <span class="source-line-no">1354</span><span id="line-1354"> * <p></span> |
| <span class="source-line-no">1355</span><span id="line-1355"> * Specifies one or more properties on beans that are read-only despite having valid getters.</span> |
| <span class="source-line-no">1356</span><span id="line-1356"> * Serializers will serialize such properties as usual, but parsers will silently ignore them.</span> |
| <span class="source-line-no">1357</span><span id="line-1357"> * Note that this is different from the {@link #beanProperties(Class,String) beanProperties}/{@link #beanPropertiesExcludes(Class,String) beanPropertiesExcludes} settings which include or exclude properties</span> |
| <span class="source-line-no">1358</span><span id="line-1358"> * for both serializers and parsers.</span> |
| <span class="source-line-no">1359</span><span id="line-1359"> *</span> |
| <span class="source-line-no">1360</span><span id="line-1360"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1361</span><span id="line-1361"> * <p class='bjava'></span> |
| <span class="source-line-no">1362</span><span id="line-1362"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">1363</span><span id="line-1363"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1364</span><span id="line-1364"> * <jk>public</jk> String <jf>foo</jf>, <jf>bar</jf>, <jf>baz</jf>;</span> |
| <span class="source-line-no">1365</span><span id="line-1365"> * }</span> |
| <span class="source-line-no">1366</span><span id="line-1366"> *</span> |
| <span class="source-line-no">1367</span><span id="line-1367"> * <jc>// Create a serializer with read-only property settings.</jc></span> |
| <span class="source-line-no">1368</span><span id="line-1368"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1369</span><span id="line-1369"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1370</span><span id="line-1370"> * .beanPropertiesReadOnly(AMap.<jsm>of</jsm>(<js>"MyBean"</js>, <js>"bar,baz"</js>))</span> |
| <span class="source-line-no">1371</span><span id="line-1371"> * .build();</span> |
| <span class="source-line-no">1372</span><span id="line-1372"> *</span> |
| <span class="source-line-no">1373</span><span id="line-1373"> * <jc>// All 3 properties will be serialized.</jc></span> |
| <span class="source-line-no">1374</span><span id="line-1374"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">1375</span><span id="line-1375"> *</span> |
| <span class="source-line-no">1376</span><span id="line-1376"> * <jc>// Create a parser with read-only property settings.</jc></span> |
| <span class="source-line-no">1377</span><span id="line-1377"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">1378</span><span id="line-1378"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1379</span><span id="line-1379"> * .beanPropertiesReadOnly(AMap.<jsm>of</jsm>(<js>"MyBean"</js>, <js>"bar,baz"</js>))</span> |
| <span class="source-line-no">1380</span><span id="line-1380"> * .ignoreUnknownBeanProperties()</span> |
| <span class="source-line-no">1381</span><span id="line-1381"> * .build();</span> |
| <span class="source-line-no">1382</span><span id="line-1382"> *</span> |
| <span class="source-line-no">1383</span><span id="line-1383"> * <jc>// Parser ignores bar and baz properties.</jc></span> |
| <span class="source-line-no">1384</span><span id="line-1384"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'foo',bar:'bar',baz:'baz'}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">1385</span><span id="line-1385"> * </p></span> |
| <span class="source-line-no">1386</span><span id="line-1386"> *</span> |
| <span class="source-line-no">1387</span><span id="line-1387"> * <p></span> |
| <span class="source-line-no">1388</span><span id="line-1388"> * This method is functionally equivalent to the following code for each entry:</span> |
| <span class="source-line-no">1389</span><span id="line-1389"> * <p class='bjava'></span> |
| <span class="source-line-no">1390</span><span id="line-1390"> * <jv>builder</jv>.annotations(BeanAnnotation.<jsm>create</jsm>(<jv>key</jv>).readOnlyProperties(<jv>value</jv>.toString()).build());</span> |
| <span class="source-line-no">1391</span><span id="line-1391"> * </p></span> |
| <span class="source-line-no">1392</span><span id="line-1392"> *</span> |
| <span class="source-line-no">1393</span><span id="line-1393"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1394</span><span id="line-1394"> * <li class='jma'>{@link Bean#readOnlyProperties()} / {@link Bean#ro()}</span> |
| <span class="source-line-no">1395</span><span id="line-1395"> * </ul></span> |
| <span class="source-line-no">1396</span><span id="line-1396"> *</span> |
| <span class="source-line-no">1397</span><span id="line-1397"> * @param values</span> |
| <span class="source-line-no">1398</span><span id="line-1398"> * The values to add to this builder.</span> |
| <span class="source-line-no">1399</span><span id="line-1399"> * <br>Keys are bean class names which can be a simple name, fully-qualified name, or <js>"*"</js> for all beans.</span> |
| <span class="source-line-no">1400</span><span id="line-1400"> * <br>Values are comma-delimited lists of property names. Non-String objects are first converted to Strings.</span> |
| <span class="source-line-no">1401</span><span id="line-1401"> * @return This object.</span> |
| <span class="source-line-no">1402</span><span id="line-1402"> */</span> |
| <span class="source-line-no">1403</span><span id="line-1403"> @FluentSetter</span> |
| <span class="source-line-no">1404</span><span id="line-1404"> public Builder beanPropertiesReadOnly(Map<String,Object> values) {</span> |
| <span class="source-line-no">1405</span><span id="line-1405"> values.forEach((k,v) -> annotations(BeanAnnotation.create(k).ro(stringify(v)).build()));</span> |
| <span class="source-line-no">1406</span><span id="line-1406"> return this;</span> |
| <span class="source-line-no">1407</span><span id="line-1407"> }</span> |
| <span class="source-line-no">1408</span><span id="line-1408"></span> |
| <span class="source-line-no">1409</span><span id="line-1409"> /**</span> |
| <span class="source-line-no">1410</span><span id="line-1410"> * Read-only bean properties.</span> |
| <span class="source-line-no">1411</span><span id="line-1411"> *</span> |
| <span class="source-line-no">1412</span><span id="line-1412"> * <p></span> |
| <span class="source-line-no">1413</span><span id="line-1413"> * Specifies one or more properties on a bean that are read-only despite having valid getters.</span> |
| <span class="source-line-no">1414</span><span id="line-1414"> * Serializers will serialize such properties as usual, but parsers will silently ignore them.</span> |
| <span class="source-line-no">1415</span><span id="line-1415"> * Note that this is different from the {@link #beanProperties(Class,String) beanProperties}/{@link #beanPropertiesExcludes(Class,String) beanPropertiesExcludes} settings which include or exclude properties</span> |
| <span class="source-line-no">1416</span><span id="line-1416"> * for both serializers and parsers.</span> |
| <span class="source-line-no">1417</span><span id="line-1417"> *</span> |
| <span class="source-line-no">1418</span><span id="line-1418"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1419</span><span id="line-1419"> * <p class='bjava'></span> |
| <span class="source-line-no">1420</span><span id="line-1420"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">1421</span><span id="line-1421"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1422</span><span id="line-1422"> * <jk>public</jk> String <jf>foo</jf>, <jf>bar</jf>, <jf>baz</jf>;</span> |
| <span class="source-line-no">1423</span><span id="line-1423"> * }</span> |
| <span class="source-line-no">1424</span><span id="line-1424"> *</span> |
| <span class="source-line-no">1425</span><span id="line-1425"> * <jc>// Create a serializer with read-only property settings.</jc></span> |
| <span class="source-line-no">1426</span><span id="line-1426"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1427</span><span id="line-1427"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1428</span><span id="line-1428"> * .beanPropertiesReadOnly(<js>"MyBean"</js>, <js>"bar,baz"</js>)</span> |
| <span class="source-line-no">1429</span><span id="line-1429"> * .build();</span> |
| <span class="source-line-no">1430</span><span id="line-1430"> *</span> |
| <span class="source-line-no">1431</span><span id="line-1431"> * <jc>// All 3 properties will be serialized.</jc></span> |
| <span class="source-line-no">1432</span><span id="line-1432"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">1433</span><span id="line-1433"> *</span> |
| <span class="source-line-no">1434</span><span id="line-1434"> * <jc>// Create a parser with read-only property settings.</jc></span> |
| <span class="source-line-no">1435</span><span id="line-1435"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">1436</span><span id="line-1436"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1437</span><span id="line-1437"> * .beanPropertiesReadOnly(<js>"MyBean"</js>, <js>"bar,baz"</js>)</span> |
| <span class="source-line-no">1438</span><span id="line-1438"> * .ignoreUnknownBeanProperties()</span> |
| <span class="source-line-no">1439</span><span id="line-1439"> * .build();</span> |
| <span class="source-line-no">1440</span><span id="line-1440"> *</span> |
| <span class="source-line-no">1441</span><span id="line-1441"> * <jc>// Parser ignores bar and baz properties.</jc></span> |
| <span class="source-line-no">1442</span><span id="line-1442"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'foo',bar:'bar',baz:'baz'}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">1443</span><span id="line-1443"> * </p></span> |
| <span class="source-line-no">1444</span><span id="line-1444"> *</span> |
| <span class="source-line-no">1445</span><span id="line-1445"> * <p></span> |
| <span class="source-line-no">1446</span><span id="line-1446"> * This method is functionally equivalent to the following code:</span> |
| <span class="source-line-no">1447</span><span id="line-1447"> * <p class='bjava'></span> |
| <span class="source-line-no">1448</span><span id="line-1448"> * <jv>builder</jv>.annotations(BeanAnnotation.<jsm>create</jsm>(<jv>beanClassName</jv>).readOnlyProperties(<jv>properties</jv>).build());</span> |
| <span class="source-line-no">1449</span><span id="line-1449"> * </p></span> |
| <span class="source-line-no">1450</span><span id="line-1450"> *</span> |
| <span class="source-line-no">1451</span><span id="line-1451"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1452</span><span id="line-1452"> * <li class='jma'>{@link Bean#readOnlyProperties()} / {@link Bean#ro()}</span> |
| <span class="source-line-no">1453</span><span id="line-1453"> * </ul></span> |
| <span class="source-line-no">1454</span><span id="line-1454"> *</span> |
| <span class="source-line-no">1455</span><span id="line-1455"> * @param beanClassName</span> |
| <span class="source-line-no">1456</span><span id="line-1456"> * The bean class name.</span> |
| <span class="source-line-no">1457</span><span id="line-1457"> * <br>Can be a simple name, fully-qualified name, or <js>"*"</js> for all bean classes.</span> |
| <span class="source-line-no">1458</span><span id="line-1458"> * @param properties Comma-delimited list of property names.</span> |
| <span class="source-line-no">1459</span><span id="line-1459"> * @return This object.</span> |
| <span class="source-line-no">1460</span><span id="line-1460"> */</span> |
| <span class="source-line-no">1461</span><span id="line-1461"> @FluentSetter</span> |
| <span class="source-line-no">1462</span><span id="line-1462"> public Builder beanPropertiesReadOnly(String beanClassName, String properties) {</span> |
| <span class="source-line-no">1463</span><span id="line-1463"> return annotations(BeanAnnotation.create(beanClassName).ro(properties).build());</span> |
| <span class="source-line-no">1464</span><span id="line-1464"> }</span> |
| <span class="source-line-no">1465</span><span id="line-1465"></span> |
| <span class="source-line-no">1466</span><span id="line-1466"> /**</span> |
| <span class="source-line-no">1467</span><span id="line-1467"> * Write-only bean properties.</span> |
| <span class="source-line-no">1468</span><span id="line-1468"> *</span> |
| <span class="source-line-no">1469</span><span id="line-1469"> * <p></span> |
| <span class="source-line-no">1470</span><span id="line-1470"> * Specifies one or more properties on a bean that are write-only despite having valid setters.</span> |
| <span class="source-line-no">1471</span><span id="line-1471"> * Parsers will parse such properties as usual, but serializers will silently ignore them.</span> |
| <span class="source-line-no">1472</span><span id="line-1472"> * Note that this is different from the {@link #beanProperties(Class,String) beanProperties}/{@link #beanPropertiesExcludes(Class,String) beanPropertiesExcludes} settings which include or exclude properties</span> |
| <span class="source-line-no">1473</span><span id="line-1473"> * for both serializers and parsers.</span> |
| <span class="source-line-no">1474</span><span id="line-1474"> *</span> |
| <span class="source-line-no">1475</span><span id="line-1475"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1476</span><span id="line-1476"> * <p class='bjava'></span> |
| <span class="source-line-no">1477</span><span id="line-1477"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">1478</span><span id="line-1478"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1479</span><span id="line-1479"> * <jk>public</jk> String <jf>foo</jf>, <jf>bar</jf>, <jf>baz</jf>;</span> |
| <span class="source-line-no">1480</span><span id="line-1480"> * }</span> |
| <span class="source-line-no">1481</span><span id="line-1481"> *</span> |
| <span class="source-line-no">1482</span><span id="line-1482"> * <jc>// Create a serializer with write-only property settings.</jc></span> |
| <span class="source-line-no">1483</span><span id="line-1483"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1484</span><span id="line-1484"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1485</span><span id="line-1485"> * .beanPropertiesWriteOnly(MyBean.<jk>class</jk>, <js>"bar,baz"</js>)</span> |
| <span class="source-line-no">1486</span><span id="line-1486"> * .build();</span> |
| <span class="source-line-no">1487</span><span id="line-1487"> *</span> |
| <span class="source-line-no">1488</span><span id="line-1488"> * <jc>// Only foo will be serialized.</jc></span> |
| <span class="source-line-no">1489</span><span id="line-1489"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">1490</span><span id="line-1490"> *</span> |
| <span class="source-line-no">1491</span><span id="line-1491"> * <jc>// Create a parser with write-only property settings.</jc></span> |
| <span class="source-line-no">1492</span><span id="line-1492"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">1493</span><span id="line-1493"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1494</span><span id="line-1494"> * .beanPropertiesWriteOnly(MyBean.<jk>class</jk>, <js>"bar,baz"</js>)</span> |
| <span class="source-line-no">1495</span><span id="line-1495"> * .build();</span> |
| <span class="source-line-no">1496</span><span id="line-1496"> *</span> |
| <span class="source-line-no">1497</span><span id="line-1497"> * <jc>// Parser parses all 3 properties.</jc></span> |
| <span class="source-line-no">1498</span><span id="line-1498"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'foo',bar:'bar',baz:'baz'}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">1499</span><span id="line-1499"> * </p></span> |
| <span class="source-line-no">1500</span><span id="line-1500"> *</span> |
| <span class="source-line-no">1501</span><span id="line-1501"> * <p></span> |
| <span class="source-line-no">1502</span><span id="line-1502"> * This method is functionally equivalent to the following code:</span> |
| <span class="source-line-no">1503</span><span id="line-1503"> * <p class='bjava'></span> |
| <span class="source-line-no">1504</span><span id="line-1504"> * <jv>builder</jv>.annotations(BeanAnnotation.<jsm>create</jsm>(<jv>beanClass</jv>).writeOnlyProperties(<jv>properties</jv>).build());</span> |
| <span class="source-line-no">1505</span><span id="line-1505"> * </p></span> |
| <span class="source-line-no">1506</span><span id="line-1506"> *</span> |
| <span class="source-line-no">1507</span><span id="line-1507"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1508</span><span id="line-1508"> * <li class='jma'>{@link Bean#writeOnlyProperties()} / {@link Bean#wo()}</span> |
| <span class="source-line-no">1509</span><span id="line-1509"> * </ul></span> |
| <span class="source-line-no">1510</span><span id="line-1510"> *</span> |
| <span class="source-line-no">1511</span><span id="line-1511"> * @param beanClass The bean class.</span> |
| <span class="source-line-no">1512</span><span id="line-1512"> * @param properties Comma-delimited list of property names.</span> |
| <span class="source-line-no">1513</span><span id="line-1513"> * @return This object.</span> |
| <span class="source-line-no">1514</span><span id="line-1514"> */</span> |
| <span class="source-line-no">1515</span><span id="line-1515"> @FluentSetter</span> |
| <span class="source-line-no">1516</span><span id="line-1516"> public Builder beanPropertiesWriteOnly(Class<?> beanClass, String properties) {</span> |
| <span class="source-line-no">1517</span><span id="line-1517"> return annotations(BeanAnnotation.create(beanClass).wo(properties).build());</span> |
| <span class="source-line-no">1518</span><span id="line-1518"> }</span> |
| <span class="source-line-no">1519</span><span id="line-1519"></span> |
| <span class="source-line-no">1520</span><span id="line-1520"> /**</span> |
| <span class="source-line-no">1521</span><span id="line-1521"> * Write-only bean properties.</span> |
| <span class="source-line-no">1522</span><span id="line-1522"> *</span> |
| <span class="source-line-no">1523</span><span id="line-1523"> * <p></span> |
| <span class="source-line-no">1524</span><span id="line-1524"> * Specifies one or more properties on a bean that are write-only despite having valid setters.</span> |
| <span class="source-line-no">1525</span><span id="line-1525"> * Parsers will parse such properties as usual, but serializers will silently ignore them.</span> |
| <span class="source-line-no">1526</span><span id="line-1526"> * Note that this is different from the {@link #beanProperties(Class,String) beanProperties}/{@link #beanPropertiesExcludes(Class,String) beanPropertiesExcludes} settings which include or exclude properties</span> |
| <span class="source-line-no">1527</span><span id="line-1527"> * for both serializers and parsers.</span> |
| <span class="source-line-no">1528</span><span id="line-1528"> *</span> |
| <span class="source-line-no">1529</span><span id="line-1529"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1530</span><span id="line-1530"> * <p class='bjava'></span> |
| <span class="source-line-no">1531</span><span id="line-1531"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">1532</span><span id="line-1532"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1533</span><span id="line-1533"> * <jk>public</jk> String <jf>foo</jf>, <jf>bar</jf>, <jf>baz</jf>;</span> |
| <span class="source-line-no">1534</span><span id="line-1534"> * }</span> |
| <span class="source-line-no">1535</span><span id="line-1535"> *</span> |
| <span class="source-line-no">1536</span><span id="line-1536"> * <jc>// Create a serializer with write-only property settings.</jc></span> |
| <span class="source-line-no">1537</span><span id="line-1537"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1538</span><span id="line-1538"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1539</span><span id="line-1539"> * .beanPropertiesWriteOnly(AMap.<jsm>of</jsm>(<js>"MyBean"</js>, <js>"bar,baz"</js>))</span> |
| <span class="source-line-no">1540</span><span id="line-1540"> * .build();</span> |
| <span class="source-line-no">1541</span><span id="line-1541"> *</span> |
| <span class="source-line-no">1542</span><span id="line-1542"> * <jc>// Only foo will be serialized.</jc></span> |
| <span class="source-line-no">1543</span><span id="line-1543"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">1544</span><span id="line-1544"> *</span> |
| <span class="source-line-no">1545</span><span id="line-1545"> * <jc>// Create a parser with write-only property settings.</jc></span> |
| <span class="source-line-no">1546</span><span id="line-1546"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">1547</span><span id="line-1547"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1548</span><span id="line-1548"> * .beanPropertiesWriteOnly(AMap.<jsm>of</jsm>(<js>"MyBean"</js>, <js>"bar,baz"</js>))</span> |
| <span class="source-line-no">1549</span><span id="line-1549"> * .build();</span> |
| <span class="source-line-no">1550</span><span id="line-1550"> *</span> |
| <span class="source-line-no">1551</span><span id="line-1551"> * <jc>// Parser parses all 3 properties.</jc></span> |
| <span class="source-line-no">1552</span><span id="line-1552"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'foo',bar:'bar',baz:'baz'}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">1553</span><span id="line-1553"> * </p></span> |
| <span class="source-line-no">1554</span><span id="line-1554"> *</span> |
| <span class="source-line-no">1555</span><span id="line-1555"> * <p></span> |
| <span class="source-line-no">1556</span><span id="line-1556"> * This method is functionally equivalent to the following code for each entry:</span> |
| <span class="source-line-no">1557</span><span id="line-1557"> * <p class='bjava'></span> |
| <span class="source-line-no">1558</span><span id="line-1558"> * <jv>builder</jv>.annotations(BeanAnnotation.<jsm>create</jsm>(<jv>key</jv>).writeOnlyProperties(<jv>value</jv>.toString()).build());</span> |
| <span class="source-line-no">1559</span><span id="line-1559"> * </p></span> |
| <span class="source-line-no">1560</span><span id="line-1560"> *</span> |
| <span class="source-line-no">1561</span><span id="line-1561"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1562</span><span id="line-1562"> * <li class='jma'>{@link Bean#writeOnlyProperties()} / {@link Bean#wo()}</span> |
| <span class="source-line-no">1563</span><span id="line-1563"> * </ul></span> |
| <span class="source-line-no">1564</span><span id="line-1564"> *</span> |
| <span class="source-line-no">1565</span><span id="line-1565"> * @param values</span> |
| <span class="source-line-no">1566</span><span id="line-1566"> * The values to add to this builder.</span> |
| <span class="source-line-no">1567</span><span id="line-1567"> * <br>Keys are bean class names which can be a simple name, fully-qualified name, or <js>"*"</js> for all beans.</span> |
| <span class="source-line-no">1568</span><span id="line-1568"> * <br>Values are comma-delimited lists of property names. Non-String objects are first converted to Strings.</span> |
| <span class="source-line-no">1569</span><span id="line-1569"> * @return This object.</span> |
| <span class="source-line-no">1570</span><span id="line-1570"> */</span> |
| <span class="source-line-no">1571</span><span id="line-1571"> @FluentSetter</span> |
| <span class="source-line-no">1572</span><span id="line-1572"> public Builder beanPropertiesWriteOnly(Map<String,Object> values) {</span> |
| <span class="source-line-no">1573</span><span id="line-1573"> values.forEach((k,v) -> annotations(BeanAnnotation.create(k).wo(stringify(v)).build()));</span> |
| <span class="source-line-no">1574</span><span id="line-1574"> return this;</span> |
| <span class="source-line-no">1575</span><span id="line-1575"> }</span> |
| <span class="source-line-no">1576</span><span id="line-1576"></span> |
| <span class="source-line-no">1577</span><span id="line-1577"> /**</span> |
| <span class="source-line-no">1578</span><span id="line-1578"> * Write-only bean properties.</span> |
| <span class="source-line-no">1579</span><span id="line-1579"> *</span> |
| <span class="source-line-no">1580</span><span id="line-1580"> * <p></span> |
| <span class="source-line-no">1581</span><span id="line-1581"> * Specifies one or more properties on a bean that are write-only despite having valid setters.</span> |
| <span class="source-line-no">1582</span><span id="line-1582"> * Parsers will parse such properties as usual, but serializers will silently ignore them.</span> |
| <span class="source-line-no">1583</span><span id="line-1583"> * Note that this is different from the {@link #beanProperties(Class,String) beanProperties}/{@link #beanPropertiesExcludes(Class,String) beanPropertiesExcludes} settings which include or exclude properties</span> |
| <span class="source-line-no">1584</span><span id="line-1584"> * for both serializers and parsers.</span> |
| <span class="source-line-no">1585</span><span id="line-1585"> *</span> |
| <span class="source-line-no">1586</span><span id="line-1586"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1587</span><span id="line-1587"> * <p class='bjava'></span> |
| <span class="source-line-no">1588</span><span id="line-1588"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">1589</span><span id="line-1589"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1590</span><span id="line-1590"> * <jk>public</jk> String <jf>foo</jf>, <jf>bar</jf>, <jf>baz</jf>;</span> |
| <span class="source-line-no">1591</span><span id="line-1591"> * }</span> |
| <span class="source-line-no">1592</span><span id="line-1592"> *</span> |
| <span class="source-line-no">1593</span><span id="line-1593"> * <jc>// Create a serializer with write-only property settings.</jc></span> |
| <span class="source-line-no">1594</span><span id="line-1594"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1595</span><span id="line-1595"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1596</span><span id="line-1596"> * .beanPropertiesWriteOnly(<js>"MyBean"</js>, <js>"bar,baz"</js>)</span> |
| <span class="source-line-no">1597</span><span id="line-1597"> * .build();</span> |
| <span class="source-line-no">1598</span><span id="line-1598"> *</span> |
| <span class="source-line-no">1599</span><span id="line-1599"> * <jc>// Only foo will be serialized.</jc></span> |
| <span class="source-line-no">1600</span><span id="line-1600"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">1601</span><span id="line-1601"> *</span> |
| <span class="source-line-no">1602</span><span id="line-1602"> * <jc>// Create a parser with write-only property settings.</jc></span> |
| <span class="source-line-no">1603</span><span id="line-1603"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">1604</span><span id="line-1604"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1605</span><span id="line-1605"> * .beanPropertiesWriteOnly(<js>"MyBean"</js>, <js>"bar,baz"</js>)</span> |
| <span class="source-line-no">1606</span><span id="line-1606"> * .build();</span> |
| <span class="source-line-no">1607</span><span id="line-1607"> *</span> |
| <span class="source-line-no">1608</span><span id="line-1608"> * <jc>// Parser parses all 3 properties.</jc></span> |
| <span class="source-line-no">1609</span><span id="line-1609"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'foo',bar:'bar',baz:'baz'}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">1610</span><span id="line-1610"> * </p></span> |
| <span class="source-line-no">1611</span><span id="line-1611"> *</span> |
| <span class="source-line-no">1612</span><span id="line-1612"> * <p></span> |
| <span class="source-line-no">1613</span><span id="line-1613"> * This method is functionally equivalent to the following code:</span> |
| <span class="source-line-no">1614</span><span id="line-1614"> * <p class='bjava'></span> |
| <span class="source-line-no">1615</span><span id="line-1615"> * <jv>builder</jv>.annotations(BeanAnnotation.<jsm>create</jsm>(<jv>beanClassName</jv>).writeOnlyProperties(<jv>properties</jv>).build());</span> |
| <span class="source-line-no">1616</span><span id="line-1616"> * </p></span> |
| <span class="source-line-no">1617</span><span id="line-1617"> *</span> |
| <span class="source-line-no">1618</span><span id="line-1618"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1619</span><span id="line-1619"> * <li class='jma'>{@link Bean#writeOnlyProperties()} / {@link Bean#wo()}</span> |
| <span class="source-line-no">1620</span><span id="line-1620"> * </ul></span> |
| <span class="source-line-no">1621</span><span id="line-1621"> *</span> |
| <span class="source-line-no">1622</span><span id="line-1622"> * @param beanClassName</span> |
| <span class="source-line-no">1623</span><span id="line-1623"> * The bean class name.</span> |
| <span class="source-line-no">1624</span><span id="line-1624"> * <br>Can be a simple name, fully-qualified name, or <js>"*"</js> for all bean classes.</span> |
| <span class="source-line-no">1625</span><span id="line-1625"> * @param properties Comma-delimited list of property names.</span> |
| <span class="source-line-no">1626</span><span id="line-1626"> * @return This object.</span> |
| <span class="source-line-no">1627</span><span id="line-1627"> */</span> |
| <span class="source-line-no">1628</span><span id="line-1628"> @FluentSetter</span> |
| <span class="source-line-no">1629</span><span id="line-1629"> public Builder beanPropertiesWriteOnly(String beanClassName, String properties) {</span> |
| <span class="source-line-no">1630</span><span id="line-1630"> return annotations(BeanAnnotation.create(beanClassName).wo(properties).build());</span> |
| <span class="source-line-no">1631</span><span id="line-1631"> }</span> |
| <span class="source-line-no">1632</span><span id="line-1632"></span> |
| <span class="source-line-no">1633</span><span id="line-1633"> /**</span> |
| <span class="source-line-no">1634</span><span id="line-1634"> * Bean dictionary.</span> |
| <span class="source-line-no">1635</span><span id="line-1635"> *</span> |
| <span class="source-line-no">1636</span><span id="line-1636"> * <p></span> |
| <span class="source-line-no">1637</span><span id="line-1637"> * The list of classes that make up the bean dictionary in this bean context.</span> |
| <span class="source-line-no">1638</span><span id="line-1638"> *</span> |
| <span class="source-line-no">1639</span><span id="line-1639"> * <p></span> |
| <span class="source-line-no">1640</span><span id="line-1640"> * Values are prepended to the list so that later calls can override classes of earlier calls.</span> |
| <span class="source-line-no">1641</span><span id="line-1641"> *</span> |
| <span class="source-line-no">1642</span><span id="line-1642"> * <p></span> |
| <span class="source-line-no">1643</span><span id="line-1643"> * A dictionary is a name/class mapping used to find class types during parsing when they cannot be inferred</span> |
| <span class="source-line-no">1644</span><span id="line-1644"> * through reflection. The names are defined through the {@link Bean#typeName() @Bean(typeName)} annotation defined</span> |
| <span class="source-line-no">1645</span><span id="line-1645"> * on the bean class. For example, if a class <c>Foo</c> has a type-name of <js>"myfoo"</js>, then it would end up</span> |
| <span class="source-line-no">1646</span><span id="line-1646"> * serialized as <js>"{_type:'myfoo',...}"</js> in JSON</span> |
| <span class="source-line-no">1647</span><span id="line-1647"> * or <js>"&lt;myfoo&gt;...&lt;/myfoo&gt;"</js> in XML.</span> |
| <span class="source-line-no">1648</span><span id="line-1648"> *</span> |
| <span class="source-line-no">1649</span><span id="line-1649"> * <p></span> |
| <span class="source-line-no">1650</span><span id="line-1650"> * This setting tells the parsers which classes to look for when resolving <js>"_type"</js> attributes.</span> |
| <span class="source-line-no">1651</span><span id="line-1651"> *</span> |
| <span class="source-line-no">1652</span><span id="line-1652"> * <p></span> |
| <span class="source-line-no">1653</span><span id="line-1653"> * Values can consist of any of the following types:</span> |
| <span class="source-line-no">1654</span><span id="line-1654"> * <ul></span> |
| <span class="source-line-no">1655</span><span id="line-1655"> * <li>Any bean class that specifies a value for {@link Bean#typeName() @Bean(typeName)}.</span> |
| <span class="source-line-no">1656</span><span id="line-1656"> * <li>Any subclass of {@link BeanDictionaryList} containing a collection of bean classes with type name annotations.</span> |
| <span class="source-line-no">1657</span><span id="line-1657"> * <li>Any subclass of {@link BeanDictionaryMap} containing a mapping of type names to classes without type name annotations.</span> |
| <span class="source-line-no">1658</span><span id="line-1658"> * <li>Any array or collection of the objects above.</span> |
| <span class="source-line-no">1659</span><span id="line-1659"> * </ul></span> |
| <span class="source-line-no">1660</span><span id="line-1660"> *</span> |
| <span class="source-line-no">1661</span><span id="line-1661"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1662</span><span id="line-1662"> * <p class='bjava'></span> |
| <span class="source-line-no">1663</span><span id="line-1663"> * <jc>// POJOs with @Bean(name) annotations.</jc></span> |
| <span class="source-line-no">1664</span><span id="line-1664"> * <ja>@Bean</ja>(typeName=<js>"foo"</js>)</span> |
| <span class="source-line-no">1665</span><span id="line-1665"> * <jk>public class</jk> Foo {...}</span> |
| <span class="source-line-no">1666</span><span id="line-1666"> * <ja>@Bean</ja>(typeName=<js>"bar"</js>)</span> |
| <span class="source-line-no">1667</span><span id="line-1667"> * <jk>public class</jk> Bar {...}</span> |
| <span class="source-line-no">1668</span><span id="line-1668"> *</span> |
| <span class="source-line-no">1669</span><span id="line-1669"> * <jc>// Create a parser and tell it which classes to try to resolve.</jc></span> |
| <span class="source-line-no">1670</span><span id="line-1670"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">1671</span><span id="line-1671"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1672</span><span id="line-1672"> * .dictionary(Foo.<jk>class</jk>, Bar.<jk>class</jk>)</span> |
| <span class="source-line-no">1673</span><span id="line-1673"> * .addBeanTypes()</span> |
| <span class="source-line-no">1674</span><span id="line-1674"> * .build();</span> |
| <span class="source-line-no">1675</span><span id="line-1675"> *</span> |
| <span class="source-line-no">1676</span><span id="line-1676"> * <jc>// A bean with a field with an indeterminate type.</jc></span> |
| <span class="source-line-no">1677</span><span id="line-1677"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1678</span><span id="line-1678"> * <jk>public</jk> Object <jf>mySimpleField</jf>;</span> |
| <span class="source-line-no">1679</span><span id="line-1679"> * }</span> |
| <span class="source-line-no">1680</span><span id="line-1680"> *</span> |
| <span class="source-line-no">1681</span><span id="line-1681"> * <jc>// Parse bean.</jc></span> |
| <span class="source-line-no">1682</span><span id="line-1682"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{mySimpleField:{_type:'foo',...}}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">1683</span><span id="line-1683"> * </p></span> |
| <span class="source-line-no">1684</span><span id="line-1684"> *</span> |
| <span class="source-line-no">1685</span><span id="line-1685"> * <p></span> |
| <span class="source-line-no">1686</span><span id="line-1686"> * Another option is to use the {@link Bean#dictionary()} annotation on the POJO class itself:</span> |
| <span class="source-line-no">1687</span><span id="line-1687"> *</span> |
| <span class="source-line-no">1688</span><span id="line-1688"> * <p class='bjava'></span> |
| <span class="source-line-no">1689</span><span id="line-1689"> * <jc>// Instead of by parser, define a bean dictionary on a class through an annotation.</jc></span> |
| <span class="source-line-no">1690</span><span id="line-1690"> * <jc>// This applies to all properties on this class and all subclasses.</jc></span> |
| <span class="source-line-no">1691</span><span id="line-1691"> * <ja>@Bean</ja>(dictionary={Foo.<jk>class</jk>,Bar.<jk>class</jk>})</span> |
| <span class="source-line-no">1692</span><span id="line-1692"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1693</span><span id="line-1693"> * <jk>public</jk> Object <jf>mySimpleField</jf>; <jc>// May contain Foo or Bar object.</jc></span> |
| <span class="source-line-no">1694</span><span id="line-1694"> * <jk>public</jk> Map&lt;String,Object&gt; <jf>myMapField</jf>; <jc>// May contain Foo or Bar objects.</jc></span> |
| <span class="source-line-no">1695</span><span id="line-1695"> * }</span> |
| <span class="source-line-no">1696</span><span id="line-1696"> * </p></span> |
| <span class="source-line-no">1697</span><span id="line-1697"> *</span> |
| <span class="source-line-no">1698</span><span id="line-1698"> * <p></span> |
| <span class="source-line-no">1699</span><span id="line-1699"> * A typical usage is to allow for HTML documents to be parsed back into HTML beans:</span> |
| <span class="source-line-no">1700</span><span id="line-1700"> * <p class='bjava'></span> |
| <span class="source-line-no">1701</span><span id="line-1701"> * <jc>// Use the predefined HTML5 bean dictionary which is a BeanDictionaryList.</jc></span> |
| <span class="source-line-no">1702</span><span id="line-1702"> * ReaderParser <jv>parser</jv> = HtmlParser</span> |
| <span class="source-line-no">1703</span><span id="line-1703"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1704</span><span id="line-1704"> * .dictionary(HtmlBeanDictionary.<jk>class</jk>)</span> |
| <span class="source-line-no">1705</span><span id="line-1705"> * .build();</span> |
| <span class="source-line-no">1706</span><span id="line-1706"> *</span> |
| <span class="source-line-no">1707</span><span id="line-1707"> * <jc>// Parse an HTML body into HTML beans.</jc></span> |
| <span class="source-line-no">1708</span><span id="line-1708"> * Body <jv>body</jv> = <jv>parser</jv>.parse(<js>"&lt;body&gt;&lt;ul&gt;&lt;li&gt;foo&lt;/li&gt;&lt;li&gt;bar&lt;/li&gt;&lt;/ul&gt;"</js>, Body.<jk>class</jk>);</span> |
| <span class="source-line-no">1709</span><span id="line-1709"> * </p></span> |
| <span class="source-line-no">1710</span><span id="line-1710"> *</span> |
| <span class="source-line-no">1711</span><span id="line-1711"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1712</span><span id="line-1712"> * <li class='ja'>{@link org.apache.juneau.annotation.Bean#dictionary()}</span> |
| <span class="source-line-no">1713</span><span id="line-1713"> * <li class='ja'>{@link org.apache.juneau.annotation.Beanp#dictionary()}</span> |
| <span class="source-line-no">1714</span><span id="line-1714"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#dictionary()}</span> |
| <span class="source-line-no">1715</span><span id="line-1715"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#dictionary_replace()}</span> |
| <span class="source-line-no">1716</span><span id="line-1716"> * <li class='jm'>{@link org.apache.juneau.BeanContext.Builder#beanDictionary(Class...)}</span> |
| <span class="source-line-no">1717</span><span id="line-1717"> * </ul></span> |
| <span class="source-line-no">1718</span><span id="line-1718"> *</span> |
| <span class="source-line-no">1719</span><span id="line-1719"> * @param values</span> |
| <span class="source-line-no">1720</span><span id="line-1720"> * The values to add to this setting.</span> |
| <span class="source-line-no">1721</span><span id="line-1721"> * @return This object.</span> |
| <span class="source-line-no">1722</span><span id="line-1722"> */</span> |
| <span class="source-line-no">1723</span><span id="line-1723"> @FluentSetter</span> |
| <span class="source-line-no">1724</span><span id="line-1724"> public Builder beanDictionary(Class<?>...values) {</span> |
| <span class="source-line-no">1725</span><span id="line-1725"> return beanDictionary(alist(values));</span> |
| <span class="source-line-no">1726</span><span id="line-1726"> }</span> |
| <span class="source-line-no">1727</span><span id="line-1727"></span> |
| <span class="source-line-no">1728</span><span id="line-1728"> /**</span> |
| <span class="source-line-no">1729</span><span id="line-1729"> * Same as {@link #beanDictionary(Class...)} but allows you to pass in a collection of classes.</span> |
| <span class="source-line-no">1730</span><span id="line-1730"> *</span> |
| <span class="source-line-no">1731</span><span id="line-1731"> * @param values</span> |
| <span class="source-line-no">1732</span><span id="line-1732"> * The values to add to this setting.</span> |
| <span class="source-line-no">1733</span><span id="line-1733"> * @return This object.</span> |
| <span class="source-line-no">1734</span><span id="line-1734"> * @see #beanDictionary(Class...)</span> |
| <span class="source-line-no">1735</span><span id="line-1735"> */</span> |
| <span class="source-line-no">1736</span><span id="line-1736"> @FluentSetter</span> |
| <span class="source-line-no">1737</span><span id="line-1737"> public Builder beanDictionary(Collection<Class<?>> values) {</span> |
| <span class="source-line-no">1738</span><span id="line-1738"> beanDictionary().addAll(0, values);</span> |
| <span class="source-line-no">1739</span><span id="line-1739"> return this;</span> |
| <span class="source-line-no">1740</span><span id="line-1740"> }</span> |
| <span class="source-line-no">1741</span><span id="line-1741"></span> |
| <span class="source-line-no">1742</span><span id="line-1742"> /**</span> |
| <span class="source-line-no">1743</span><span id="line-1743"> * Returns the bean dictionary list.</span> |
| <span class="source-line-no">1744</span><span id="line-1744"> *</span> |
| <span class="source-line-no">1745</span><span id="line-1745"> * <p></span> |
| <span class="source-line-no">1746</span><span id="line-1746"> * Gives access to the inner list if you need to make more than simple additions via {@link #beanDictionary(Class...)}.</span> |
| <span class="source-line-no">1747</span><span id="line-1747"> *</span> |
| <span class="source-line-no">1748</span><span id="line-1748"> * @return The bean dictionary list.</span> |
| <span class="source-line-no">1749</span><span id="line-1749"> * @see #beanDictionary(Class...)</span> |
| <span class="source-line-no">1750</span><span id="line-1750"> */</span> |
| <span class="source-line-no">1751</span><span id="line-1751"> public List<Class<?>> beanDictionary() {</span> |
| <span class="source-line-no">1752</span><span id="line-1752"> if (beanDictionary == null)</span> |
| <span class="source-line-no">1753</span><span id="line-1753"> beanDictionary = list();</span> |
| <span class="source-line-no">1754</span><span id="line-1754"> return beanDictionary;</span> |
| <span class="source-line-no">1755</span><span id="line-1755"> }</span> |
| <span class="source-line-no">1756</span><span id="line-1756"></span> |
| <span class="source-line-no">1757</span><span id="line-1757"> /**</span> |
| <span class="source-line-no">1758</span><span id="line-1758"> * Bean dictionary.</span> |
| <span class="source-line-no">1759</span><span id="line-1759"> *</span> |
| <span class="source-line-no">1760</span><span id="line-1760"> * <p></span> |
| <span class="source-line-no">1761</span><span id="line-1761"> * This is identical to {@link #beanDictionary(Class...)}, but specifies a dictionary within the context of</span> |
| <span class="source-line-no">1762</span><span id="line-1762"> * a single class as opposed to globally.</span> |
| <span class="source-line-no">1763</span><span id="line-1763"> *</span> |
| <span class="source-line-no">1764</span><span id="line-1764"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1765</span><span id="line-1765"> * <p class='bjava'></span> |
| <span class="source-line-no">1766</span><span id="line-1766"> * <jc>// POJOs with @Bean(name) annotations.</jc></span> |
| <span class="source-line-no">1767</span><span id="line-1767"> * <ja>@Bean</ja>(typeName=<js>"foo"</js>)</span> |
| <span class="source-line-no">1768</span><span id="line-1768"> * <jk>public class</jk> Foo {...}</span> |
| <span class="source-line-no">1769</span><span id="line-1769"> * <ja>@Bean</ja>(typeName=<js>"bar"</js>)</span> |
| <span class="source-line-no">1770</span><span id="line-1770"> * <jk>public class</jk> Bar {...}</span> |
| <span class="source-line-no">1771</span><span id="line-1771"> *</span> |
| <span class="source-line-no">1772</span><span id="line-1772"> * <jc>// A bean with a field with an indeterminate type.</jc></span> |
| <span class="source-line-no">1773</span><span id="line-1773"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1774</span><span id="line-1774"> * <jk>public</jk> Object <jf>mySimpleField</jf>;</span> |
| <span class="source-line-no">1775</span><span id="line-1775"> * }</span> |
| <span class="source-line-no">1776</span><span id="line-1776"> *</span> |
| <span class="source-line-no">1777</span><span id="line-1777"> * <jc>// Create a parser and tell it which classes to try to resolve.</jc></span> |
| <span class="source-line-no">1778</span><span id="line-1778"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">1779</span><span id="line-1779"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1780</span><span id="line-1780"> * .dictionaryOn(MyBean.<jk>class</jk>, Foo.<jk>class</jk>, Bar.<jk>class</jk>)</span> |
| <span class="source-line-no">1781</span><span id="line-1781"> * .build();</span> |
| <span class="source-line-no">1782</span><span id="line-1782"> *</span> |
| <span class="source-line-no">1783</span><span id="line-1783"> * <jc>// Parse bean.</jc></span> |
| <span class="source-line-no">1784</span><span id="line-1784"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{mySimpleField:{_type:'foo',...}}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">1785</span><span id="line-1785"> * </p></span> |
| <span class="source-line-no">1786</span><span id="line-1786"> *</span> |
| <span class="source-line-no">1787</span><span id="line-1787"> * <p></span> |
| <span class="source-line-no">1788</span><span id="line-1788"> * This is functionally equivalent to the {@link Bean#dictionary()} annotation.</span> |
| <span class="source-line-no">1789</span><span id="line-1789"> *</span> |
| <span class="source-line-no">1790</span><span id="line-1790"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1791</span><span id="line-1791"> * <li class='jma'>{@link Bean#dictionary()}</span> |
| <span class="source-line-no">1792</span><span id="line-1792"> * <li class='jm'>{@link #beanDictionary(Class...)}</span> |
| <span class="source-line-no">1793</span><span id="line-1793"> * </ul></span> |
| <span class="source-line-no">1794</span><span id="line-1794"> *</span> |
| <span class="source-line-no">1795</span><span id="line-1795"> * @param on The class that the dictionary values apply to.</span> |
| <span class="source-line-no">1796</span><span id="line-1796"> * @param values</span> |
| <span class="source-line-no">1797</span><span id="line-1797"> * The new values for this setting.</span> |
| <span class="source-line-no">1798</span><span id="line-1798"> * @return This object.</span> |
| <span class="source-line-no">1799</span><span id="line-1799"> */</span> |
| <span class="source-line-no">1800</span><span id="line-1800"> @FluentSetter</span> |
| <span class="source-line-no">1801</span><span id="line-1801"> public Builder dictionaryOn(Class<?> on, Class<?>...values) {</span> |
| <span class="source-line-no">1802</span><span id="line-1802"> return annotations(BeanAnnotation.create(on).dictionary(values).build());</span> |
| <span class="source-line-no">1803</span><span id="line-1803"> }</span> |
| <span class="source-line-no">1804</span><span id="line-1804"></span> |
| <span class="source-line-no">1805</span><span id="line-1805"> /**</span> |
| <span class="source-line-no">1806</span><span id="line-1806"> * POJO example.</span> |
| <span class="source-line-no">1807</span><span id="line-1807"> *</span> |
| <span class="source-line-no">1808</span><span id="line-1808"> * <p></span> |
| <span class="source-line-no">1809</span><span id="line-1809"> * Specifies an example of the specified class.</span> |
| <span class="source-line-no">1810</span><span id="line-1810"> *</span> |
| <span class="source-line-no">1811</span><span id="line-1811"> * <p></span> |
| <span class="source-line-no">1812</span><span id="line-1812"> * Examples are used in cases such as POJO examples in Swagger documents.</span> |
| <span class="source-line-no">1813</span><span id="line-1813"> *</span> |
| <span class="source-line-no">1814</span><span id="line-1814"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1815</span><span id="line-1815"> * <p class='bjava'></span> |
| <span class="source-line-no">1816</span><span id="line-1816"> * <jc>// Create a serializer that excludes the 'foo' and 'bar' properties on the MyBean class.</jc></span> |
| <span class="source-line-no">1817</span><span id="line-1817"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1818</span><span id="line-1818"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1819</span><span id="line-1819"> * .example(MyBean.<jk>class</jk>, <jk>new</jk> MyBean().setFoo(<js>"foo"</js>).setBar(123))</span> |
| <span class="source-line-no">1820</span><span id="line-1820"> * .build();</span> |
| <span class="source-line-no">1821</span><span id="line-1821"> * </p></span> |
| <span class="source-line-no">1822</span><span id="line-1822"> *</span> |
| <span class="source-line-no">1823</span><span id="line-1823"> * <p></span> |
| <span class="source-line-no">1824</span><span id="line-1824"> * This is a shorthand method for the following code:</span> |
| <span class="source-line-no">1825</span><span id="line-1825"> * <p class='bjava'></span> |
| <span class="source-line-no">1826</span><span id="line-1826"> * <jv>builder</jv>.annotations(MarshalledAnnotation.<jsm>create</jsm>(<jv>pojoClass</jv>).example(Json5.<jsf>DEFAULT</jsf>.toString(<jv>object</jv>)).build())</span> |
| <span class="source-line-no">1827</span><span id="line-1827"> * </p></span> |
| <span class="source-line-no">1828</span><span id="line-1828"> *</span> |
| <span class="source-line-no">1829</span><span id="line-1829"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">1830</span><span id="line-1830"> * <li class='note'>Using this method assumes the serialized form of the object is the same as that produced</span> |
| <span class="source-line-no">1831</span><span id="line-1831"> * by the default serializer. This may not be true based on settings or swaps on the constructed serializer.</span> |
| <span class="source-line-no">1832</span><span id="line-1832"> * </ul></span> |
| <span class="source-line-no">1833</span><span id="line-1833"> *</span> |
| <span class="source-line-no">1834</span><span id="line-1834"> * <p></span> |
| <span class="source-line-no">1835</span><span id="line-1835"> * POJO examples can also be defined on classes via the following:</span> |
| <span class="source-line-no">1836</span><span id="line-1836"> * <ul class='spaced-list'></span> |
| <span class="source-line-no">1837</span><span id="line-1837"> * <li>The {@link Marshalled#example()} annotation on the class itself.</span> |
| <span class="source-line-no">1838</span><span id="line-1838"> * <li>A static field annotated with {@link Example @Example}.</span> |
| <span class="source-line-no">1839</span><span id="line-1839"> * <li>A static method annotated with {@link Example @Example} with zero arguments or one {@link BeanSession} argument.</span> |
| <span class="source-line-no">1840</span><span id="line-1840"> * <li>A static method with name <c>example</c> with no arguments or one {@link BeanSession} argument.</span> |
| <span class="source-line-no">1841</span><span id="line-1841"> * </ul></span> |
| <span class="source-line-no">1842</span><span id="line-1842"> *</span> |
| <span class="source-line-no">1843</span><span id="line-1843"> * @param <T> The POJO class.</span> |
| <span class="source-line-no">1844</span><span id="line-1844"> * @param pojoClass The POJO class.</span> |
| <span class="source-line-no">1845</span><span id="line-1845"> * @param o</span> |
| <span class="source-line-no">1846</span><span id="line-1846"> * An instance of the POJO class used for examples.</span> |
| <span class="source-line-no">1847</span><span id="line-1847"> * @return This object.</span> |
| <span class="source-line-no">1848</span><span id="line-1848"> */</span> |
| <span class="source-line-no">1849</span><span id="line-1849"> @FluentSetter</span> |
| <span class="source-line-no">1850</span><span id="line-1850"> public <T> Builder example(Class<T> pojoClass, T o) {</span> |
| <span class="source-line-no">1851</span><span id="line-1851"> return annotations(MarshalledAnnotation.create(pojoClass).example(Json5.of(o)).build());</span> |
| <span class="source-line-no">1852</span><span id="line-1852"> }</span> |
| <span class="source-line-no">1853</span><span id="line-1853"></span> |
| <span class="source-line-no">1854</span><span id="line-1854"> /**</span> |
| <span class="source-line-no">1855</span><span id="line-1855"> * POJO example.</span> |
| <span class="source-line-no">1856</span><span id="line-1856"> *</span> |
| <span class="source-line-no">1857</span><span id="line-1857"> * <p></span> |
| <span class="source-line-no">1858</span><span id="line-1858"> * Specifies an example in JSON of the specified class.</span> |
| <span class="source-line-no">1859</span><span id="line-1859"> *</span> |
| <span class="source-line-no">1860</span><span id="line-1860"> * <p></span> |
| <span class="source-line-no">1861</span><span id="line-1861"> * Examples are used in cases such as POJO examples in Swagger documents.</span> |
| <span class="source-line-no">1862</span><span id="line-1862"> *</span> |
| <span class="source-line-no">1863</span><span id="line-1863"> * <p></span> |
| <span class="source-line-no">1864</span><span id="line-1864"> * Setting applies to specified class and all subclasses.</span> |
| <span class="source-line-no">1865</span><span id="line-1865"> *</span> |
| <span class="source-line-no">1866</span><span id="line-1866"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1867</span><span id="line-1867"> * <p class='bjava'></span> |
| <span class="source-line-no">1868</span><span id="line-1868"> * <jc>// Create a serializer that excludes the 'foo' and 'bar' properties on the MyBean class.</jc></span> |
| <span class="source-line-no">1869</span><span id="line-1869"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">1870</span><span id="line-1870"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1871</span><span id="line-1871"> * .example(MyBean.<jk>class</jk>, <js>"{foo:'bar'}"</js>)</span> |
| <span class="source-line-no">1872</span><span id="line-1872"> * .build();</span> |
| <span class="source-line-no">1873</span><span id="line-1873"> * </p></span> |
| <span class="source-line-no">1874</span><span id="line-1874"> *</span> |
| <span class="source-line-no">1875</span><span id="line-1875"> * <p></span> |
| <span class="source-line-no">1876</span><span id="line-1876"> * This is a shorthand method for the following code:</span> |
| <span class="source-line-no">1877</span><span id="line-1877"> * <p class='bjava'></span> |
| <span class="source-line-no">1878</span><span id="line-1878"> * <jv>builder</jv>.annotations(MarshalledAnnotation.<jsm>create</jsm>(<jv>pojoClass</jv>).example(<jv>json</jv>).build())</span> |
| <span class="source-line-no">1879</span><span id="line-1879"> * </p></span> |
| <span class="source-line-no">1880</span><span id="line-1880"> *</span> |
| <span class="source-line-no">1881</span><span id="line-1881"> * <p></span> |
| <span class="source-line-no">1882</span><span id="line-1882"> * POJO examples can also be defined on classes via the following:</span> |
| <span class="source-line-no">1883</span><span id="line-1883"> * <ul class='spaced-list'></span> |
| <span class="source-line-no">1884</span><span id="line-1884"> * <li>A static field annotated with {@link Example @Example}.</span> |
| <span class="source-line-no">1885</span><span id="line-1885"> * <li>A static method annotated with {@link Example @Example} with zero arguments or one {@link BeanSession} argument.</span> |
| <span class="source-line-no">1886</span><span id="line-1886"> * <li>A static method with name <c>example</c> with no arguments or one {@link BeanSession} argument.</span> |
| <span class="source-line-no">1887</span><span id="line-1887"> * </ul></span> |
| <span class="source-line-no">1888</span><span id="line-1888"> *</span> |
| <span class="source-line-no">1889</span><span id="line-1889"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1890</span><span id="line-1890"> * <li class='ja'>{@link Marshalled#example()}</span> |
| <span class="source-line-no">1891</span><span id="line-1891"> * </ul></span> |
| <span class="source-line-no">1892</span><span id="line-1892"> *</span> |
| <span class="source-line-no">1893</span><span id="line-1893"> * @param <T> The POJO class type.</span> |
| <span class="source-line-no">1894</span><span id="line-1894"> * @param pojoClass The POJO class.</span> |
| <span class="source-line-no">1895</span><span id="line-1895"> * @param json The JSON 5 representation of the example.</span> |
| <span class="source-line-no">1896</span><span id="line-1896"> * @return This object.</span> |
| <span class="source-line-no">1897</span><span id="line-1897"> */</span> |
| <span class="source-line-no">1898</span><span id="line-1898"> @FluentSetter</span> |
| <span class="source-line-no">1899</span><span id="line-1899"> public <T> Builder example(Class<T> pojoClass, String json) {</span> |
| <span class="source-line-no">1900</span><span id="line-1900"> return annotations(MarshalledAnnotation.create(pojoClass).example(json).build());</span> |
| <span class="source-line-no">1901</span><span id="line-1901"> }</span> |
| <span class="source-line-no">1902</span><span id="line-1902"></span> |
| <span class="source-line-no">1903</span><span id="line-1903"> /**</span> |
| <span class="source-line-no">1904</span><span id="line-1904"> * Find fluent setters.</span> |
| <span class="source-line-no">1905</span><span id="line-1905"> *</span> |
| <span class="source-line-no">1906</span><span id="line-1906"> * <p></span> |
| <span class="source-line-no">1907</span><span id="line-1907"> * When enabled, fluent setters are detected on beans during parsing.</span> |
| <span class="source-line-no">1908</span><span id="line-1908"> *</span> |
| <span class="source-line-no">1909</span><span id="line-1909"> * <p></span> |
| <span class="source-line-no">1910</span><span id="line-1910"> * Fluent setters must have the following attributes:</span> |
| <span class="source-line-no">1911</span><span id="line-1911"> * <ul></span> |
| <span class="source-line-no">1912</span><span id="line-1912"> * <li>Public.</span> |
| <span class="source-line-no">1913</span><span id="line-1913"> * <li>Not static.</span> |
| <span class="source-line-no">1914</span><span id="line-1914"> * <li>Take in one parameter.</span> |
| <span class="source-line-no">1915</span><span id="line-1915"> * <li>Return the bean itself.</span> |
| <span class="source-line-no">1916</span><span id="line-1916"> * </ul></span> |
| <span class="source-line-no">1917</span><span id="line-1917"> *</span> |
| <span class="source-line-no">1918</span><span id="line-1918"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1919</span><span id="line-1919"> * <p class='bjava'></span> |
| <span class="source-line-no">1920</span><span id="line-1920"> * <jc>// A bean with a fluent setter.</jc></span> |
| <span class="source-line-no">1921</span><span id="line-1921"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1922</span><span id="line-1922"> * <jk>public</jk> MyBean foo(String <jv>value</jv>) {...}</span> |
| <span class="source-line-no">1923</span><span id="line-1923"> * }</span> |
| <span class="source-line-no">1924</span><span id="line-1924"> *</span> |
| <span class="source-line-no">1925</span><span id="line-1925"> * <jc>// Create a parser that finds fluent setters.</jc></span> |
| <span class="source-line-no">1926</span><span id="line-1926"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">1927</span><span id="line-1927"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1928</span><span id="line-1928"> * .findFluentSetters()</span> |
| <span class="source-line-no">1929</span><span id="line-1929"> * .build();</span> |
| <span class="source-line-no">1930</span><span id="line-1930"> *</span> |
| <span class="source-line-no">1931</span><span id="line-1931"> * <jc>// Parse into bean using fluent setter.</jc></span> |
| <span class="source-line-no">1932</span><span id="line-1932"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'bar'}"</js>);</span> |
| <span class="source-line-no">1933</span><span id="line-1933"> * </p></span> |
| <span class="source-line-no">1934</span><span id="line-1934"> *</span> |
| <span class="source-line-no">1935</span><span id="line-1935"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">1936</span><span id="line-1936"> * <li class='note'>The {@link Beanp @Beanp} annotation can also be used on methods to individually identify them as fluent setters.</span> |
| <span class="source-line-no">1937</span><span id="line-1937"> * <li class='note'>The {@link Bean#findFluentSetters() @Bean.fluentSetters()} annotation can also be used on classes to specify to look for fluent setters.</span> |
| <span class="source-line-no">1938</span><span id="line-1938"> * </ul></span> |
| <span class="source-line-no">1939</span><span id="line-1939"> *</span> |
| <span class="source-line-no">1940</span><span id="line-1940"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1941</span><span id="line-1941"> * <li class='ja'>{@link org.apache.juneau.annotation.Bean#findFluentSetters()}</span> |
| <span class="source-line-no">1942</span><span id="line-1942"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#findFluentSetters()}</span> |
| <span class="source-line-no">1943</span><span id="line-1943"> * </ul></span> |
| <span class="source-line-no">1944</span><span id="line-1944"> *</span> |
| <span class="source-line-no">1945</span><span id="line-1945"> * @return This object.</span> |
| <span class="source-line-no">1946</span><span id="line-1946"> */</span> |
| <span class="source-line-no">1947</span><span id="line-1947"> @FluentSetter</span> |
| <span class="source-line-no">1948</span><span id="line-1948"> public Builder findFluentSetters() {</span> |
| <span class="source-line-no">1949</span><span id="line-1949"> return findFluentSetters(true);</span> |
| <span class="source-line-no">1950</span><span id="line-1950"> }</span> |
| <span class="source-line-no">1951</span><span id="line-1951"></span> |
| <span class="source-line-no">1952</span><span id="line-1952"> /**</span> |
| <span class="source-line-no">1953</span><span id="line-1953"> * Same as {@link #findFluentSetters()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">1954</span><span id="line-1954"> *</span> |
| <span class="source-line-no">1955</span><span id="line-1955"> * @param value The value for this setting.</span> |
| <span class="source-line-no">1956</span><span id="line-1956"> * @return This object.</span> |
| <span class="source-line-no">1957</span><span id="line-1957"> */</span> |
| <span class="source-line-no">1958</span><span id="line-1958"> @FluentSetter</span> |
| <span class="source-line-no">1959</span><span id="line-1959"> public Builder findFluentSetters(boolean value) {</span> |
| <span class="source-line-no">1960</span><span id="line-1960"> findFluentSetters = value;</span> |
| <span class="source-line-no">1961</span><span id="line-1961"> return this;</span> |
| <span class="source-line-no">1962</span><span id="line-1962"> }</span> |
| <span class="source-line-no">1963</span><span id="line-1963"></span> |
| <span class="source-line-no">1964</span><span id="line-1964"> /**</span> |
| <span class="source-line-no">1965</span><span id="line-1965"> * Find fluent setters.</span> |
| <span class="source-line-no">1966</span><span id="line-1966"> *</span> |
| <span class="source-line-no">1967</span><span id="line-1967"> * <p></span> |
| <span class="source-line-no">1968</span><span id="line-1968"> * Identical to {@link #findFluentSetters()} but enables it on a specific class only.</span> |
| <span class="source-line-no">1969</span><span id="line-1969"> *</span> |
| <span class="source-line-no">1970</span><span id="line-1970"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">1971</span><span id="line-1971"> * <p class='bjava'></span> |
| <span class="source-line-no">1972</span><span id="line-1972"> * <jc>// A bean with a fluent setter.</jc></span> |
| <span class="source-line-no">1973</span><span id="line-1973"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">1974</span><span id="line-1974"> * <jk>public</jk> MyBean foo(String <jv>value</jv>) {...}</span> |
| <span class="source-line-no">1975</span><span id="line-1975"> * }</span> |
| <span class="source-line-no">1976</span><span id="line-1976"> *</span> |
| <span class="source-line-no">1977</span><span id="line-1977"> * <jc>// Create a parser that finds fluent setters.</jc></span> |
| <span class="source-line-no">1978</span><span id="line-1978"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">1979</span><span id="line-1979"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">1980</span><span id="line-1980"> * .findFluentSetters(MyBean.<jk>class</jk>)</span> |
| <span class="source-line-no">1981</span><span id="line-1981"> * .build();</span> |
| <span class="source-line-no">1982</span><span id="line-1982"> *</span> |
| <span class="source-line-no">1983</span><span id="line-1983"> * <jc>// Parse into bean using fluent setter.</jc></span> |
| <span class="source-line-no">1984</span><span id="line-1984"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'bar'}"</js>);</span> |
| <span class="source-line-no">1985</span><span id="line-1985"> * </p></span> |
| <span class="source-line-no">1986</span><span id="line-1986"> *</span> |
| <span class="source-line-no">1987</span><span id="line-1987"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">1988</span><span id="line-1988"> * <li class='note'>This method is functionally equivalent to using the {@link Bean#findFluentSetters()} annotation.</span> |
| <span class="source-line-no">1989</span><span id="line-1989"> * </ul></span> |
| <span class="source-line-no">1990</span><span id="line-1990"> *</span> |
| <span class="source-line-no">1991</span><span id="line-1991"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">1992</span><span id="line-1992"> * <li class='ja'>{@link Bean#findFluentSetters()}</span> |
| <span class="source-line-no">1993</span><span id="line-1993"> * <li class='jm'>{@link #findFluentSetters()}</span> |
| <span class="source-line-no">1994</span><span id="line-1994"> * </ul></span> |
| <span class="source-line-no">1995</span><span id="line-1995"> *</span> |
| <span class="source-line-no">1996</span><span id="line-1996"> * @param on The class that this applies to.</span> |
| <span class="source-line-no">1997</span><span id="line-1997"> * @return This object.</span> |
| <span class="source-line-no">1998</span><span id="line-1998"> */</span> |
| <span class="source-line-no">1999</span><span id="line-1999"> @FluentSetter</span> |
| <span class="source-line-no">2000</span><span id="line-2000"> public Builder findFluentSetters(Class<?> on) {</span> |
| <span class="source-line-no">2001</span><span id="line-2001"> return annotations(BeanAnnotation.create(on).findFluentSetters(true).build());</span> |
| <span class="source-line-no">2002</span><span id="line-2002"> }</span> |
| <span class="source-line-no">2003</span><span id="line-2003"></span> |
| <span class="source-line-no">2004</span><span id="line-2004"> /**</span> |
| <span class="source-line-no">2005</span><span id="line-2005"> * Ignore invocation errors on getters.</span> |
| <span class="source-line-no">2006</span><span id="line-2006"> *</span> |
| <span class="source-line-no">2007</span><span id="line-2007"> * <p></span> |
| <span class="source-line-no">2008</span><span id="line-2008"> * When enabled, errors thrown when calling bean getter methods will silently be ignored.</span> |
| <span class="source-line-no">2009</span><span id="line-2009"> * Otherwise, a {@code BeanRuntimeException} is thrown.</span> |
| <span class="source-line-no">2010</span><span id="line-2010"> *</span> |
| <span class="source-line-no">2011</span><span id="line-2011"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2012</span><span id="line-2012"> * <p class='bjava'></span> |
| <span class="source-line-no">2013</span><span id="line-2013"> * <jc>// A bean with a property that throws an exception.</jc></span> |
| <span class="source-line-no">2014</span><span id="line-2014"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">2015</span><span id="line-2015"> * <jk>public</jk> String getFoo() {</span> |
| <span class="source-line-no">2016</span><span id="line-2016"> * <jk>throw new</jk> RuntimeException(<js>"foo"</js>);</span> |
| <span class="source-line-no">2017</span><span id="line-2017"> * }</span> |
| <span class="source-line-no">2018</span><span id="line-2018"> * }</span> |
| <span class="source-line-no">2019</span><span id="line-2019"> *</span> |
| <span class="source-line-no">2020</span><span id="line-2020"> * <jc>// Create a serializer that ignores bean getter exceptions.</jc></span> |
| <span class="source-line-no">2021</span><span id="line-2021"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2022</span><span id="line-2022"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2023</span><span id="line-2023"> * .ingoreInvocationExceptionsOnGetters()</span> |
| <span class="source-line-no">2024</span><span id="line-2024"> * .build();</span> |
| <span class="source-line-no">2025</span><span id="line-2025"> *</span> |
| <span class="source-line-no">2026</span><span id="line-2026"> * <jc>// Exception is ignored.</jc></span> |
| <span class="source-line-no">2027</span><span id="line-2027"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">2028</span><span id="line-2028"> * </p></span> |
| <span class="source-line-no">2029</span><span id="line-2029"> *</span> |
| <span class="source-line-no">2030</span><span id="line-2030"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">2031</span><span id="line-2031"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#ignoreInvocationExceptionsOnGetters()}</span> |
| <span class="source-line-no">2032</span><span id="line-2032"> * </ul></span> |
| <span class="source-line-no">2033</span><span id="line-2033"> *</span> |
| <span class="source-line-no">2034</span><span id="line-2034"> * @return This object.</span> |
| <span class="source-line-no">2035</span><span id="line-2035"> */</span> |
| <span class="source-line-no">2036</span><span id="line-2036"> @FluentSetter</span> |
| <span class="source-line-no">2037</span><span id="line-2037"> public Builder ignoreInvocationExceptionsOnGetters() {</span> |
| <span class="source-line-no">2038</span><span id="line-2038"> return ignoreInvocationExceptionsOnGetters(true);</span> |
| <span class="source-line-no">2039</span><span id="line-2039"> }</span> |
| <span class="source-line-no">2040</span><span id="line-2040"></span> |
| <span class="source-line-no">2041</span><span id="line-2041"> /**</span> |
| <span class="source-line-no">2042</span><span id="line-2042"> * Same as {@link #ignoreInvocationExceptionsOnGetters()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">2043</span><span id="line-2043"> *</span> |
| <span class="source-line-no">2044</span><span id="line-2044"> * @param value The value for this setting.</span> |
| <span class="source-line-no">2045</span><span id="line-2045"> * @return This object.</span> |
| <span class="source-line-no">2046</span><span id="line-2046"> */</span> |
| <span class="source-line-no">2047</span><span id="line-2047"> @FluentSetter</span> |
| <span class="source-line-no">2048</span><span id="line-2048"> public Builder ignoreInvocationExceptionsOnGetters(boolean value) {</span> |
| <span class="source-line-no">2049</span><span id="line-2049"> ignoreInvocationExceptionsOnGetters = value;</span> |
| <span class="source-line-no">2050</span><span id="line-2050"> return this;</span> |
| <span class="source-line-no">2051</span><span id="line-2051"> }</span> |
| <span class="source-line-no">2052</span><span id="line-2052"></span> |
| <span class="source-line-no">2053</span><span id="line-2053"> /**</span> |
| <span class="source-line-no">2054</span><span id="line-2054"> * Ignore invocation errors on setters.</span> |
| <span class="source-line-no">2055</span><span id="line-2055"> *</span> |
| <span class="source-line-no">2056</span><span id="line-2056"> * <p></span> |
| <span class="source-line-no">2057</span><span id="line-2057"> * When enabled, errors thrown when calling bean setter methods will silently be ignored.</span> |
| <span class="source-line-no">2058</span><span id="line-2058"> * Otherwise, a {@code BeanRuntimeException} is thrown.</span> |
| <span class="source-line-no">2059</span><span id="line-2059"> *</span> |
| <span class="source-line-no">2060</span><span id="line-2060"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2061</span><span id="line-2061"> * <p class='bjava'></span> |
| <span class="source-line-no">2062</span><span id="line-2062"> * <jc>// A bean with a property that throws an exception.</jc></span> |
| <span class="source-line-no">2063</span><span id="line-2063"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">2064</span><span id="line-2064"> * <jk>public void</jk> setFoo(String <jv>foo</jv>) {</span> |
| <span class="source-line-no">2065</span><span id="line-2065"> * <jk>throw new</jk> RuntimeException(<js>"foo"</js>);</span> |
| <span class="source-line-no">2066</span><span id="line-2066"> * }</span> |
| <span class="source-line-no">2067</span><span id="line-2067"> * }</span> |
| <span class="source-line-no">2068</span><span id="line-2068"> *</span> |
| <span class="source-line-no">2069</span><span id="line-2069"> * <jc>// Create a parser that ignores bean setter exceptions.</jc></span> |
| <span class="source-line-no">2070</span><span id="line-2070"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">2071</span><span id="line-2071"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2072</span><span id="line-2072"> * .ignoreInvocationExceptionsOnSetters()</span> |
| <span class="source-line-no">2073</span><span id="line-2073"> * .build();</span> |
| <span class="source-line-no">2074</span><span id="line-2074"> *</span> |
| <span class="source-line-no">2075</span><span id="line-2075"> * <jc>// Exception is ignored.</jc></span> |
| <span class="source-line-no">2076</span><span id="line-2076"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'bar'}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">2077</span><span id="line-2077"> * </p></span> |
| <span class="source-line-no">2078</span><span id="line-2078"> *</span> |
| <span class="source-line-no">2079</span><span id="line-2079"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">2080</span><span id="line-2080"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#ignoreInvocationExceptionsOnSetters()}</span> |
| <span class="source-line-no">2081</span><span id="line-2081"> * </ul></span> |
| <span class="source-line-no">2082</span><span id="line-2082"> *</span> |
| <span class="source-line-no">2083</span><span id="line-2083"> * @return This object.</span> |
| <span class="source-line-no">2084</span><span id="line-2084"> */</span> |
| <span class="source-line-no">2085</span><span id="line-2085"> @FluentSetter</span> |
| <span class="source-line-no">2086</span><span id="line-2086"> public Builder ignoreInvocationExceptionsOnSetters() {</span> |
| <span class="source-line-no">2087</span><span id="line-2087"> return ignoreInvocationExceptionsOnSetters(true);</span> |
| <span class="source-line-no">2088</span><span id="line-2088"> }</span> |
| <span class="source-line-no">2089</span><span id="line-2089"></span> |
| <span class="source-line-no">2090</span><span id="line-2090"> /**</span> |
| <span class="source-line-no">2091</span><span id="line-2091"> * Same as {@link #ignoreInvocationExceptionsOnSetters()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">2092</span><span id="line-2092"> *</span> |
| <span class="source-line-no">2093</span><span id="line-2093"> * @param value The value for this setting.</span> |
| <span class="source-line-no">2094</span><span id="line-2094"> * @return This object.</span> |
| <span class="source-line-no">2095</span><span id="line-2095"> */</span> |
| <span class="source-line-no">2096</span><span id="line-2096"> @FluentSetter</span> |
| <span class="source-line-no">2097</span><span id="line-2097"> public Builder ignoreInvocationExceptionsOnSetters(boolean value) {</span> |
| <span class="source-line-no">2098</span><span id="line-2098"> ignoreInvocationExceptionsOnSetters = value;</span> |
| <span class="source-line-no">2099</span><span id="line-2099"> return this;</span> |
| <span class="source-line-no">2100</span><span id="line-2100"> }</span> |
| <span class="source-line-no">2101</span><span id="line-2101"></span> |
| <span class="source-line-no">2102</span><span id="line-2102"> /**</span> |
| <span class="source-line-no">2103</span><span id="line-2103"> * Don't silently ignore missing setters.</span> |
| <span class="source-line-no">2104</span><span id="line-2104"> *</span> |
| <span class="source-line-no">2105</span><span id="line-2105"> * <p></span> |
| <span class="source-line-no">2106</span><span id="line-2106"> * When enabled, trying to set a value on a bean property without a setter will throw a {@link BeanRuntimeException}.</span> |
| <span class="source-line-no">2107</span><span id="line-2107"> * Otherwise, it will be silently ignored.</span> |
| <span class="source-line-no">2108</span><span id="line-2108"> *</span> |
| <span class="source-line-no">2109</span><span id="line-2109"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2110</span><span id="line-2110"> * <p class='bjava'></span> |
| <span class="source-line-no">2111</span><span id="line-2111"> * <jc>// A bean with a property with a getter but not a setter.</jc></span> |
| <span class="source-line-no">2112</span><span id="line-2112"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">2113</span><span id="line-2113"> * <jk>public void</jk> getFoo() {</span> |
| <span class="source-line-no">2114</span><span id="line-2114"> * <jk>return</jk> <js>"foo"</js>;</span> |
| <span class="source-line-no">2115</span><span id="line-2115"> * }</span> |
| <span class="source-line-no">2116</span><span id="line-2116"> * }</span> |
| <span class="source-line-no">2117</span><span id="line-2117"> *</span> |
| <span class="source-line-no">2118</span><span id="line-2118"> * <jc>// Create a parser that throws an exception if a setter is not found but a getter is.</jc></span> |
| <span class="source-line-no">2119</span><span id="line-2119"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">2120</span><span id="line-2120"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2121</span><span id="line-2121"> * .disableIgnoreMissingSetters()</span> |
| <span class="source-line-no">2122</span><span id="line-2122"> * .build();</span> |
| <span class="source-line-no">2123</span><span id="line-2123"> *</span> |
| <span class="source-line-no">2124</span><span id="line-2124"> * <jc>// Throws a ParseException.</jc></span> |
| <span class="source-line-no">2125</span><span id="line-2125"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'bar'}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">2126</span><span id="line-2126"> * </p></span> |
| <span class="source-line-no">2127</span><span id="line-2127"> *</span> |
| <span class="source-line-no">2128</span><span id="line-2128"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">2129</span><span id="line-2129"> * <li class='note'>The {@link BeanIgnore @BeanIgnore} annotation can also be used on getters and fields to ignore them.</span> |
| <span class="source-line-no">2130</span><span id="line-2130"> * </ul></span> |
| <span class="source-line-no">2131</span><span id="line-2131"> *</span> |
| <span class="source-line-no">2132</span><span id="line-2132"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">2133</span><span id="line-2133"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#disableIgnoreMissingSetters()}</span> |
| <span class="source-line-no">2134</span><span id="line-2134"> * </ul></span> |
| <span class="source-line-no">2135</span><span id="line-2135"> *</span> |
| <span class="source-line-no">2136</span><span id="line-2136"> * @return This object.</span> |
| <span class="source-line-no">2137</span><span id="line-2137"> */</span> |
| <span class="source-line-no">2138</span><span id="line-2138"> @FluentSetter</span> |
| <span class="source-line-no">2139</span><span id="line-2139"> public Builder disableIgnoreMissingSetters() {</span> |
| <span class="source-line-no">2140</span><span id="line-2140"> return disableIgnoreMissingSetters(true);</span> |
| <span class="source-line-no">2141</span><span id="line-2141"> }</span> |
| <span class="source-line-no">2142</span><span id="line-2142"></span> |
| <span class="source-line-no">2143</span><span id="line-2143"> /**</span> |
| <span class="source-line-no">2144</span><span id="line-2144"> * Same as {@link #disableIgnoreMissingSetters()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">2145</span><span id="line-2145"> *</span> |
| <span class="source-line-no">2146</span><span id="line-2146"> * @param value The value for this setting.</span> |
| <span class="source-line-no">2147</span><span id="line-2147"> * @return This object.</span> |
| <span class="source-line-no">2148</span><span id="line-2148"> */</span> |
| <span class="source-line-no">2149</span><span id="line-2149"> @FluentSetter</span> |
| <span class="source-line-no">2150</span><span id="line-2150"> public Builder disableIgnoreMissingSetters(boolean value) {</span> |
| <span class="source-line-no">2151</span><span id="line-2151"> disableIgnoreMissingSetters = value;</span> |
| <span class="source-line-no">2152</span><span id="line-2152"> return this;</span> |
| <span class="source-line-no">2153</span><span id="line-2153"> }</span> |
| <span class="source-line-no">2154</span><span id="line-2154"></span> |
| <span class="source-line-no">2155</span><span id="line-2155"> /**</span> |
| <span class="source-line-no">2156</span><span id="line-2156"> * Don't ignore transient fields.</span> |
| <span class="source-line-no">2157</span><span id="line-2157"> *</span> |
| <span class="source-line-no">2158</span><span id="line-2158"> * <p></span> |
| <span class="source-line-no">2159</span><span id="line-2159"> * When enabled, methods and fields marked as <jk>transient</jk> will not be ignored as bean properties.</span> |
| <span class="source-line-no">2160</span><span id="line-2160"> *</span> |
| <span class="source-line-no">2161</span><span id="line-2161"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2162</span><span id="line-2162"> * <p class='bjava'></span> |
| <span class="source-line-no">2163</span><span id="line-2163"> * <jc>// A bean with a transient field.</jc></span> |
| <span class="source-line-no">2164</span><span id="line-2164"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">2165</span><span id="line-2165"> * <jk>public transient</jk> String <jf>foo</jf> = <js>"foo"</js>;</span> |
| <span class="source-line-no">2166</span><span id="line-2166"> * }</span> |
| <span class="source-line-no">2167</span><span id="line-2167"> *</span> |
| <span class="source-line-no">2168</span><span id="line-2168"> * <jc>// Create a serializer that doesn't ignore transient fields.</jc></span> |
| <span class="source-line-no">2169</span><span id="line-2169"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2170</span><span id="line-2170"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2171</span><span id="line-2171"> * .disableIgnoreTransientFields()</span> |
| <span class="source-line-no">2172</span><span id="line-2172"> * .build();</span> |
| <span class="source-line-no">2173</span><span id="line-2173"> *</span> |
| <span class="source-line-no">2174</span><span id="line-2174"> * <jc>// Produces: {"foo":"foo"}</jc></span> |
| <span class="source-line-no">2175</span><span id="line-2175"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">2176</span><span id="line-2176"> * </p></span> |
| <span class="source-line-no">2177</span><span id="line-2177"> *</span> |
| <span class="source-line-no">2178</span><span id="line-2178"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">2179</span><span id="line-2179"> * <li class='note'>The {@link Beanp @Beanp} annotation can also be used on transient fields to keep them from being ignored.</span> |
| <span class="source-line-no">2180</span><span id="line-2180"> * </ul></span> |
| <span class="source-line-no">2181</span><span id="line-2181"> *</span> |
| <span class="source-line-no">2182</span><span id="line-2182"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">2183</span><span id="line-2183"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#disableIgnoreTransientFields()}</span> |
| <span class="source-line-no">2184</span><span id="line-2184"> * </ul></span> |
| <span class="source-line-no">2185</span><span id="line-2185"> *</span> |
| <span class="source-line-no">2186</span><span id="line-2186"> * @return This object.</span> |
| <span class="source-line-no">2187</span><span id="line-2187"> */</span> |
| <span class="source-line-no">2188</span><span id="line-2188"> @FluentSetter</span> |
| <span class="source-line-no">2189</span><span id="line-2189"> public Builder disableIgnoreTransientFields() {</span> |
| <span class="source-line-no">2190</span><span id="line-2190"> return disableIgnoreTransientFields(true);</span> |
| <span class="source-line-no">2191</span><span id="line-2191"> }</span> |
| <span class="source-line-no">2192</span><span id="line-2192"></span> |
| <span class="source-line-no">2193</span><span id="line-2193"> /**</span> |
| <span class="source-line-no">2194</span><span id="line-2194"> * Same as {@link #disableIgnoreTransientFields()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">2195</span><span id="line-2195"> *</span> |
| <span class="source-line-no">2196</span><span id="line-2196"> * @param value The value for this setting.</span> |
| <span class="source-line-no">2197</span><span id="line-2197"> * @return This object.</span> |
| <span class="source-line-no">2198</span><span id="line-2198"> */</span> |
| <span class="source-line-no">2199</span><span id="line-2199"> @FluentSetter</span> |
| <span class="source-line-no">2200</span><span id="line-2200"> public Builder disableIgnoreTransientFields(boolean value) {</span> |
| <span class="source-line-no">2201</span><span id="line-2201"> disableIgnoreTransientFields = value;</span> |
| <span class="source-line-no">2202</span><span id="line-2202"> return this;</span> |
| <span class="source-line-no">2203</span><span id="line-2203"> }</span> |
| <span class="source-line-no">2204</span><span id="line-2204"></span> |
| <span class="source-line-no">2205</span><span id="line-2205"> /**</span> |
| <span class="source-line-no">2206</span><span id="line-2206"> * Ignore unknown properties.</span> |
| <span class="source-line-no">2207</span><span id="line-2207"> *</span> |
| <span class="source-line-no">2208</span><span id="line-2208"> * <p></span> |
| <span class="source-line-no">2209</span><span id="line-2209"> * When enabled, trying to set a value on a non-existent bean property will silently be ignored.</span> |
| <span class="source-line-no">2210</span><span id="line-2210"> * Otherwise, a {@code BeanRuntimeException} is thrown.</span> |
| <span class="source-line-no">2211</span><span id="line-2211"> *</span> |
| <span class="source-line-no">2212</span><span id="line-2212"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2213</span><span id="line-2213"> * <p class='bjava'></span> |
| <span class="source-line-no">2214</span><span id="line-2214"> * <jc>// A bean with a single property.</jc></span> |
| <span class="source-line-no">2215</span><span id="line-2215"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">2216</span><span id="line-2216"> * <jk>public</jk> String <jf>foo</jf>;</span> |
| <span class="source-line-no">2217</span><span id="line-2217"> * }</span> |
| <span class="source-line-no">2218</span><span id="line-2218"> *</span> |
| <span class="source-line-no">2219</span><span id="line-2219"> * <jc>// Create a parser that ignores missing bean properties.</jc></span> |
| <span class="source-line-no">2220</span><span id="line-2220"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">2221</span><span id="line-2221"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2222</span><span id="line-2222"> * .ignoreUnknownBeanProperties()</span> |
| <span class="source-line-no">2223</span><span id="line-2223"> * .build();</span> |
| <span class="source-line-no">2224</span><span id="line-2224"> *</span> |
| <span class="source-line-no">2225</span><span id="line-2225"> * <jc>// Doesn't throw an exception on unknown 'bar' property.</jc></span> |
| <span class="source-line-no">2226</span><span id="line-2226"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'foo',bar:'bar'}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">2227</span><span id="line-2227"> * </p></span> |
| <span class="source-line-no">2228</span><span id="line-2228"> *</span> |
| <span class="source-line-no">2229</span><span id="line-2229"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">2230</span><span id="line-2230"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#ignoreUnknownBeanProperties()}</span> |
| <span class="source-line-no">2231</span><span id="line-2231"> * </ul></span> |
| <span class="source-line-no">2232</span><span id="line-2232"> *</span> |
| <span class="source-line-no">2233</span><span id="line-2233"> * @return This object.</span> |
| <span class="source-line-no">2234</span><span id="line-2234"> */</span> |
| <span class="source-line-no">2235</span><span id="line-2235"> @FluentSetter</span> |
| <span class="source-line-no">2236</span><span id="line-2236"> public Builder ignoreUnknownBeanProperties() {</span> |
| <span class="source-line-no">2237</span><span id="line-2237"> return ignoreUnknownBeanProperties(true);</span> |
| <span class="source-line-no">2238</span><span id="line-2238"> }</span> |
| <span class="source-line-no">2239</span><span id="line-2239"></span> |
| <span class="source-line-no">2240</span><span id="line-2240"> /**</span> |
| <span class="source-line-no">2241</span><span id="line-2241"> * Same as {@link #ignoreUnknownBeanProperties()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">2242</span><span id="line-2242"> *</span> |
| <span class="source-line-no">2243</span><span id="line-2243"> * @param value The value for this setting.</span> |
| <span class="source-line-no">2244</span><span id="line-2244"> * @return This object.</span> |
| <span class="source-line-no">2245</span><span id="line-2245"> */</span> |
| <span class="source-line-no">2246</span><span id="line-2246"> @FluentSetter</span> |
| <span class="source-line-no">2247</span><span id="line-2247"> public Builder ignoreUnknownBeanProperties(boolean value) {</span> |
| <span class="source-line-no">2248</span><span id="line-2248"> ignoreUnknownBeanProperties = value;</span> |
| <span class="source-line-no">2249</span><span id="line-2249"> return this;</span> |
| <span class="source-line-no">2250</span><span id="line-2250"> }</span> |
| <span class="source-line-no">2251</span><span id="line-2251"></span> |
| <span class="source-line-no">2252</span><span id="line-2252"> /**</span> |
| <span class="source-line-no">2253</span><span id="line-2253"> * Ignore unknown properties.</span> |
| <span class="source-line-no">2254</span><span id="line-2254"> *</span> |
| <span class="source-line-no">2255</span><span id="line-2255"> * <p></span> |
| <span class="source-line-no">2256</span><span id="line-2256"> * When enabled, unknown enum values will be set to <jk>null</jk> instead of throwing an exception.</span> |
| <span class="source-line-no">2257</span><span id="line-2257"> *</span> |
| <span class="source-line-no">2258</span><span id="line-2258"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">2259</span><span id="line-2259"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#ignoreUnknownEnumValues()}</span> |
| <span class="source-line-no">2260</span><span id="line-2260"> * </ul></span> |
| <span class="source-line-no">2261</span><span id="line-2261"> *</span> |
| <span class="source-line-no">2262</span><span id="line-2262"> * @return This object.</span> |
| <span class="source-line-no">2263</span><span id="line-2263"> */</span> |
| <span class="source-line-no">2264</span><span id="line-2264"> @FluentSetter</span> |
| <span class="source-line-no">2265</span><span id="line-2265"> public Builder ignoreUnknownEnumValues() {</span> |
| <span class="source-line-no">2266</span><span id="line-2266"> return ignoreUnknownEnumValues(true);</span> |
| <span class="source-line-no">2267</span><span id="line-2267"> }</span> |
| <span class="source-line-no">2268</span><span id="line-2268"></span> |
| <span class="source-line-no">2269</span><span id="line-2269"> /**</span> |
| <span class="source-line-no">2270</span><span id="line-2270"> * Same as {@link #ignoreUnknownEnumValues()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">2271</span><span id="line-2271"> *</span> |
| <span class="source-line-no">2272</span><span id="line-2272"> * @param value The value for this setting.</span> |
| <span class="source-line-no">2273</span><span id="line-2273"> * @return This object.</span> |
| <span class="source-line-no">2274</span><span id="line-2274"> */</span> |
| <span class="source-line-no">2275</span><span id="line-2275"> @FluentSetter</span> |
| <span class="source-line-no">2276</span><span id="line-2276"> public Builder ignoreUnknownEnumValues(boolean value) {</span> |
| <span class="source-line-no">2277</span><span id="line-2277"> ignoreUnknownEnumValues = value;</span> |
| <span class="source-line-no">2278</span><span id="line-2278"> return this;</span> |
| <span class="source-line-no">2279</span><span id="line-2279"> }</span> |
| <span class="source-line-no">2280</span><span id="line-2280"></span> |
| <span class="source-line-no">2281</span><span id="line-2281"> /**</span> |
| <span class="source-line-no">2282</span><span id="line-2282"> * Don't ignore unknown properties with null values.</span> |
| <span class="source-line-no">2283</span><span id="line-2283"> *</span> |
| <span class="source-line-no">2284</span><span id="line-2284"> * <p></span> |
| <span class="source-line-no">2285</span><span id="line-2285"> * When enabled, trying to set a <jk>null</jk> value on a non-existent bean property will throw a {@link BeanRuntimeException}.</span> |
| <span class="source-line-no">2286</span><span id="line-2286"> * Otherwise it will be silently ignored.</span> |
| <span class="source-line-no">2287</span><span id="line-2287"> *</span> |
| <span class="source-line-no">2288</span><span id="line-2288"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2289</span><span id="line-2289"> * <p class='bjava'></span> |
| <span class="source-line-no">2290</span><span id="line-2290"> * <jc>// A bean with a single property.</jc></span> |
| <span class="source-line-no">2291</span><span id="line-2291"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">2292</span><span id="line-2292"> * <jk>public</jk> String <jf>foo</jf>;</span> |
| <span class="source-line-no">2293</span><span id="line-2293"> * }</span> |
| <span class="source-line-no">2294</span><span id="line-2294"> *</span> |
| <span class="source-line-no">2295</span><span id="line-2295"> * <jc>// Create a parser that throws an exception on an unknown property even if the value being set is null.</jc></span> |
| <span class="source-line-no">2296</span><span id="line-2296"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">2297</span><span id="line-2297"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2298</span><span id="line-2298"> * .disableIgnoreUnknownNullBeanProperties()</span> |
| <span class="source-line-no">2299</span><span id="line-2299"> * .build();</span> |
| <span class="source-line-no">2300</span><span id="line-2300"> *</span> |
| <span class="source-line-no">2301</span><span id="line-2301"> * <jc>// Throws a BeanRuntimeException wrapped in a ParseException on the unknown 'bar' property.</jc></span> |
| <span class="source-line-no">2302</span><span id="line-2302"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"{foo:'foo',bar:null}"</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">2303</span><span id="line-2303"> * </p></span> |
| <span class="source-line-no">2304</span><span id="line-2304"> *</span> |
| <span class="source-line-no">2305</span><span id="line-2305"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">2306</span><span id="line-2306"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#disableIgnoreUnknownNullBeanProperties()}</span> |
| <span class="source-line-no">2307</span><span id="line-2307"> * </ul></span> |
| <span class="source-line-no">2308</span><span id="line-2308"> *</span> |
| <span class="source-line-no">2309</span><span id="line-2309"> * @return This object.</span> |
| <span class="source-line-no">2310</span><span id="line-2310"> */</span> |
| <span class="source-line-no">2311</span><span id="line-2311"> @FluentSetter</span> |
| <span class="source-line-no">2312</span><span id="line-2312"> public Builder disableIgnoreUnknownNullBeanProperties() {</span> |
| <span class="source-line-no">2313</span><span id="line-2313"> return disableIgnoreUnknownNullBeanProperties(true);</span> |
| <span class="source-line-no">2314</span><span id="line-2314"> }</span> |
| <span class="source-line-no">2315</span><span id="line-2315"></span> |
| <span class="source-line-no">2316</span><span id="line-2316"> /**</span> |
| <span class="source-line-no">2317</span><span id="line-2317"> * Same as {@link #disableIgnoreUnknownNullBeanProperties()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">2318</span><span id="line-2318"> *</span> |
| <span class="source-line-no">2319</span><span id="line-2319"> * @param value The value for this setting.</span> |
| <span class="source-line-no">2320</span><span id="line-2320"> * @return This object.</span> |
| <span class="source-line-no">2321</span><span id="line-2321"> */</span> |
| <span class="source-line-no">2322</span><span id="line-2322"> @FluentSetter</span> |
| <span class="source-line-no">2323</span><span id="line-2323"> public Builder disableIgnoreUnknownNullBeanProperties(boolean value) {</span> |
| <span class="source-line-no">2324</span><span id="line-2324"> disableIgnoreUnknownNullBeanProperties = value;</span> |
| <span class="source-line-no">2325</span><span id="line-2325"> return this;</span> |
| <span class="source-line-no">2326</span><span id="line-2326"> }</span> |
| <span class="source-line-no">2327</span><span id="line-2327"></span> |
| <span class="source-line-no">2328</span><span id="line-2328"> /**</span> |
| <span class="source-line-no">2329</span><span id="line-2329"> * Implementation classes.</span> |
| <span class="source-line-no">2330</span><span id="line-2330"> *</span> |
| <span class="source-line-no">2331</span><span id="line-2331"> * <p></span> |
| <span class="source-line-no">2332</span><span id="line-2332"> * For interfaces and abstract classes this method can be used to specify an implementation class for the</span> |
| <span class="source-line-no">2333</span><span id="line-2333"> * interface/abstract class so that instances of the implementation class are used when instantiated (e.g. during a</span> |
| <span class="source-line-no">2334</span><span id="line-2334"> * parse).</span> |
| <span class="source-line-no">2335</span><span id="line-2335"> *</span> |
| <span class="source-line-no">2336</span><span id="line-2336"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2337</span><span id="line-2337"> * <p class='bjava'></span> |
| <span class="source-line-no">2338</span><span id="line-2338"> * <jc>// A bean interface.</jc></span> |
| <span class="source-line-no">2339</span><span id="line-2339"> * <jk>public interface</jk> MyBean {</span> |
| <span class="source-line-no">2340</span><span id="line-2340"> * ...</span> |
| <span class="source-line-no">2341</span><span id="line-2341"> * }</span> |
| <span class="source-line-no">2342</span><span id="line-2342"> *</span> |
| <span class="source-line-no">2343</span><span id="line-2343"> * <jc>// A bean implementation.</jc></span> |
| <span class="source-line-no">2344</span><span id="line-2344"> * <jk>public class</jk> MyBeanImpl <jk>implements</jk> MyBean {</span> |
| <span class="source-line-no">2345</span><span id="line-2345"> * ...</span> |
| <span class="source-line-no">2346</span><span id="line-2346"> * }</span> |
| <span class="source-line-no">2347</span><span id="line-2347"></span> |
| <span class="source-line-no">2348</span><span id="line-2348"> * <jc>// Create a parser that instantiates MyBeanImpls when parsing MyBeans.</jc></span> |
| <span class="source-line-no">2349</span><span id="line-2349"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">2350</span><span id="line-2350"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2351</span><span id="line-2351"> * .implClass(MyBean.<jk>class</jk>, MyBeanImpl.<jk>class</jk>)</span> |
| <span class="source-line-no">2352</span><span id="line-2352"> * .build();</span> |
| <span class="source-line-no">2353</span><span id="line-2353"> *</span> |
| <span class="source-line-no">2354</span><span id="line-2354"> * <jc>// Instantiates a MyBeanImpl,</jc></span> |
| <span class="source-line-no">2355</span><span id="line-2355"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"..."</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">2356</span><span id="line-2356"> * </p></span> |
| <span class="source-line-no">2357</span><span id="line-2357"> *</span> |
| <span class="source-line-no">2358</span><span id="line-2358"> * @param interfaceClass The interface class.</span> |
| <span class="source-line-no">2359</span><span id="line-2359"> * @param implClass The implementation class.</span> |
| <span class="source-line-no">2360</span><span id="line-2360"> * @return This object.</span> |
| <span class="source-line-no">2361</span><span id="line-2361"> */</span> |
| <span class="source-line-no">2362</span><span id="line-2362"> @FluentSetter</span> |
| <span class="source-line-no">2363</span><span id="line-2363"> public Builder implClass(Class<?> interfaceClass, Class<?> implClass) {</span> |
| <span class="source-line-no">2364</span><span id="line-2364"> return annotations(MarshalledAnnotation.create(interfaceClass).implClass(implClass).build());</span> |
| <span class="source-line-no">2365</span><span id="line-2365"> }</span> |
| <span class="source-line-no">2366</span><span id="line-2366"></span> |
| <span class="source-line-no">2367</span><span id="line-2367"> /**</span> |
| <span class="source-line-no">2368</span><span id="line-2368"> * Implementation classes.</span> |
| <span class="source-line-no">2369</span><span id="line-2369"> *</span> |
| <span class="source-line-no">2370</span><span id="line-2370"> * <p></span> |
| <span class="source-line-no">2371</span><span id="line-2371"> * For interfaces and abstract classes this method can be used to specify an implementation class for the</span> |
| <span class="source-line-no">2372</span><span id="line-2372"> * interface/abstract class so that instances of the implementation class are used when instantiated (e.g. during a</span> |
| <span class="source-line-no">2373</span><span id="line-2373"> * parse).</span> |
| <span class="source-line-no">2374</span><span id="line-2374"> *</span> |
| <span class="source-line-no">2375</span><span id="line-2375"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2376</span><span id="line-2376"> * <p class='bjava'></span> |
| <span class="source-line-no">2377</span><span id="line-2377"> * <jc>// A bean with a single property.</jc></span> |
| <span class="source-line-no">2378</span><span id="line-2378"> * <jk>public interface</jk> MyBean {</span> |
| <span class="source-line-no">2379</span><span id="line-2379"> * ...</span> |
| <span class="source-line-no">2380</span><span id="line-2380"> * }</span> |
| <span class="source-line-no">2381</span><span id="line-2381"> *</span> |
| <span class="source-line-no">2382</span><span id="line-2382"> * <jc>// A bean with a single property.</jc></span> |
| <span class="source-line-no">2383</span><span id="line-2383"> * <jk>public class</jk> MyBeanImpl <jk>implements</jk> MyBean {</span> |
| <span class="source-line-no">2384</span><span id="line-2384"> * ...</span> |
| <span class="source-line-no">2385</span><span id="line-2385"> * }</span> |
| <span class="source-line-no">2386</span><span id="line-2386"></span> |
| <span class="source-line-no">2387</span><span id="line-2387"> * <jc>// Create a parser that instantiates MyBeanImpls when parsing MyBeans.</jc></span> |
| <span class="source-line-no">2388</span><span id="line-2388"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">2389</span><span id="line-2389"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2390</span><span id="line-2390"> * .implClasses(AMap.<jsm>of</jsm>(MyBean.<jk>class</jk>, MyBeanImpl.<jk>class</jk>))</span> |
| <span class="source-line-no">2391</span><span id="line-2391"> * .build();</span> |
| <span class="source-line-no">2392</span><span id="line-2392"> *</span> |
| <span class="source-line-no">2393</span><span id="line-2393"> * <jc>// Instantiates a MyBeanImpl,</jc></span> |
| <span class="source-line-no">2394</span><span id="line-2394"> * MyBean <jv>myBean</jv> = <jv>parser</jv>.parse(<js>"..."</js>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">2395</span><span id="line-2395"> * </p></span> |
| <span class="source-line-no">2396</span><span id="line-2396"> *</span> |
| <span class="source-line-no">2397</span><span id="line-2397"> * @param values</span> |
| <span class="source-line-no">2398</span><span id="line-2398"> * The new value for this setting.</span> |
| <span class="source-line-no">2399</span><span id="line-2399"> * @return This object.</span> |
| <span class="source-line-no">2400</span><span id="line-2400"> */</span> |
| <span class="source-line-no">2401</span><span id="line-2401"> @FluentSetter</span> |
| <span class="source-line-no">2402</span><span id="line-2402"> public Builder implClasses(Map<Class<?>,Class<?>> values) {</span> |
| <span class="source-line-no">2403</span><span id="line-2403"> values.forEach((k,v) -> annotations(MarshalledAnnotation.create(k).implClass(v).build()));</span> |
| <span class="source-line-no">2404</span><span id="line-2404"> return this;</span> |
| <span class="source-line-no">2405</span><span id="line-2405"> }</span> |
| <span class="source-line-no">2406</span><span id="line-2406"></span> |
| <span class="source-line-no">2407</span><span id="line-2407"> /**</span> |
| <span class="source-line-no">2408</span><span id="line-2408"> * Identifies a class to be used as the interface class for the specified class and all subclasses.</span> |
| <span class="source-line-no">2409</span><span id="line-2409"> *</span> |
| <span class="source-line-no">2410</span><span id="line-2410"> * <p></span> |
| <span class="source-line-no">2411</span><span id="line-2411"> * When specified, only the list of properties defined on the interface class will be used during serialization.</span> |
| <span class="source-line-no">2412</span><span id="line-2412"> * Additional properties on subclasses will be ignored.</span> |
| <span class="source-line-no">2413</span><span id="line-2413"> *</span> |
| <span class="source-line-no">2414</span><span id="line-2414"> * <p class='bjava'></span> |
| <span class="source-line-no">2415</span><span id="line-2415"> * <jc>// Parent class or interface</jc></span> |
| <span class="source-line-no">2416</span><span id="line-2416"> * <jk>public abstract class</jk> A {</span> |
| <span class="source-line-no">2417</span><span id="line-2417"> * <jk>public</jk> String <jf>foo</jf> = <js>"foo"</js>;</span> |
| <span class="source-line-no">2418</span><span id="line-2418"> * }</span> |
| <span class="source-line-no">2419</span><span id="line-2419"> *</span> |
| <span class="source-line-no">2420</span><span id="line-2420"> * <jc>// Sub class</jc></span> |
| <span class="source-line-no">2421</span><span id="line-2421"> * <jk>public class</jk> A1 <jk>extends</jk> A {</span> |
| <span class="source-line-no">2422</span><span id="line-2422"> * <jk>public</jk> String <jf>bar</jf> = <js>"bar"</js>;</span> |
| <span class="source-line-no">2423</span><span id="line-2423"> * }</span> |
| <span class="source-line-no">2424</span><span id="line-2424"> *</span> |
| <span class="source-line-no">2425</span><span id="line-2425"> * <jc>// Create a serializer and define our interface class mapping.</jc></span> |
| <span class="source-line-no">2426</span><span id="line-2426"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2427</span><span id="line-2427"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2428</span><span id="line-2428"> * .interfaceClass(A1.<jk>class</jk>, A.<jk>class</jk>)</span> |
| <span class="source-line-no">2429</span><span id="line-2429"> * .build();</span> |
| <span class="source-line-no">2430</span><span id="line-2430"> *</span> |
| <span class="source-line-no">2431</span><span id="line-2431"> * <jc>// Produces "{"foo":"foo"}"</jc></span> |
| <span class="source-line-no">2432</span><span id="line-2432"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> A1());</span> |
| <span class="source-line-no">2433</span><span id="line-2433"> * </p></span> |
| <span class="source-line-no">2434</span><span id="line-2434"> *</span> |
| <span class="source-line-no">2435</span><span id="line-2435"> * <p></span> |
| <span class="source-line-no">2436</span><span id="line-2436"> * This annotation can be used on the parent class so that it filters to all child classes, or can be set</span> |
| <span class="source-line-no">2437</span><span id="line-2437"> * individually on the child classes.</span> |
| <span class="source-line-no">2438</span><span id="line-2438"> *</span> |
| <span class="source-line-no">2439</span><span id="line-2439"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">2440</span><span id="line-2440"> * <li class='note'>The {@link Bean#interfaceClass() @Bean(interfaceClass)} annotation is the equivalent annotation-based solution.</span> |
| <span class="source-line-no">2441</span><span id="line-2441"> * </ul></span> |
| <span class="source-line-no">2442</span><span id="line-2442"> *</span> |
| <span class="source-line-no">2443</span><span id="line-2443"> * @param on The class that the interface class applies to.</span> |
| <span class="source-line-no">2444</span><span id="line-2444"> * @param value</span> |
| <span class="source-line-no">2445</span><span id="line-2445"> * The new value for this setting.</span> |
| <span class="source-line-no">2446</span><span id="line-2446"> * @return This object.</span> |
| <span class="source-line-no">2447</span><span id="line-2447"> */</span> |
| <span class="source-line-no">2448</span><span id="line-2448"> @FluentSetter</span> |
| <span class="source-line-no">2449</span><span id="line-2449"> public Builder interfaceClass(Class<?> on, Class<?> value) {</span> |
| <span class="source-line-no">2450</span><span id="line-2450"> return annotations(BeanAnnotation.create(on).interfaceClass(value).build());</span> |
| <span class="source-line-no">2451</span><span id="line-2451"> }</span> |
| <span class="source-line-no">2452</span><span id="line-2452"></span> |
| <span class="source-line-no">2453</span><span id="line-2453"> /**</span> |
| <span class="source-line-no">2454</span><span id="line-2454"> * Identifies a set of interfaces.</span> |
| <span class="source-line-no">2455</span><span id="line-2455"> *</span> |
| <span class="source-line-no">2456</span><span id="line-2456"> * <p></span> |
| <span class="source-line-no">2457</span><span id="line-2457"> * When specified, only the list of properties defined on the interface class will be used during serialization</span> |
| <span class="source-line-no">2458</span><span id="line-2458"> * of implementation classes. Additional properties on subclasses will be ignored.</span> |
| <span class="source-line-no">2459</span><span id="line-2459"> *</span> |
| <span class="source-line-no">2460</span><span id="line-2460"> * <p class='bjava'></span> |
| <span class="source-line-no">2461</span><span id="line-2461"> * <jc>// Parent class or interface</jc></span> |
| <span class="source-line-no">2462</span><span id="line-2462"> * <jk>public abstract class</jk> A {</span> |
| <span class="source-line-no">2463</span><span id="line-2463"> * <jk>public</jk> String <jf>foo</jf> = <js>"foo"</js>;</span> |
| <span class="source-line-no">2464</span><span id="line-2464"> * }</span> |
| <span class="source-line-no">2465</span><span id="line-2465"> *</span> |
| <span class="source-line-no">2466</span><span id="line-2466"> * <jc>// Sub class</jc></span> |
| <span class="source-line-no">2467</span><span id="line-2467"> * <jk>public class</jk> A1 <jk>extends</jk> A {</span> |
| <span class="source-line-no">2468</span><span id="line-2468"> * <jk>public</jk> String <jf>bar</jf> = <js>"bar"</js>;</span> |
| <span class="source-line-no">2469</span><span id="line-2469"> * }</span> |
| <span class="source-line-no">2470</span><span id="line-2470"> *</span> |
| <span class="source-line-no">2471</span><span id="line-2471"> * <jc>// Create a serializer and define our interface class mapping.</jc></span> |
| <span class="source-line-no">2472</span><span id="line-2472"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2473</span><span id="line-2473"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2474</span><span id="line-2474"> * .interfaces(A.<jk>class</jk>)</span> |
| <span class="source-line-no">2475</span><span id="line-2475"> * .build();</span> |
| <span class="source-line-no">2476</span><span id="line-2476"> *</span> |
| <span class="source-line-no">2477</span><span id="line-2477"> * <jc>// Produces "{"foo":"foo"}"</jc></span> |
| <span class="source-line-no">2478</span><span id="line-2478"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> A1());</span> |
| <span class="source-line-no">2479</span><span id="line-2479"> * </p></span> |
| <span class="source-line-no">2480</span><span id="line-2480"> *</span> |
| <span class="source-line-no">2481</span><span id="line-2481"> * <p></span> |
| <span class="source-line-no">2482</span><span id="line-2482"> * This annotation can be used on the parent class so that it filters to all child classes, or can be set</span> |
| <span class="source-line-no">2483</span><span id="line-2483"> * individually on the child classes.</span> |
| <span class="source-line-no">2484</span><span id="line-2484"> *</span> |
| <span class="source-line-no">2485</span><span id="line-2485"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">2486</span><span id="line-2486"> * <li class='note'>The {@link Bean#interfaceClass() @Bean(interfaceClass)} annotation is the equivalent annotation-based solution.</span> |
| <span class="source-line-no">2487</span><span id="line-2487"> * </ul></span> |
| <span class="source-line-no">2488</span><span id="line-2488"> *</span> |
| <span class="source-line-no">2489</span><span id="line-2489"> * @param value</span> |
| <span class="source-line-no">2490</span><span id="line-2490"> * The new value for this setting.</span> |
| <span class="source-line-no">2491</span><span id="line-2491"> * @return This object.</span> |
| <span class="source-line-no">2492</span><span id="line-2492"> */</span> |
| <span class="source-line-no">2493</span><span id="line-2493"> @FluentSetter</span> |
| <span class="source-line-no">2494</span><span id="line-2494"> public Builder interfaces(Class<?>...value) {</span> |
| <span class="source-line-no">2495</span><span id="line-2495"> for (Class<?> v : value)</span> |
| <span class="source-line-no">2496</span><span id="line-2496"> annotations(BeanAnnotation.create(v).interfaceClass(v).build());</span> |
| <span class="source-line-no">2497</span><span id="line-2497"> return this;</span> |
| <span class="source-line-no">2498</span><span id="line-2498"> }</span> |
| <span class="source-line-no">2499</span><span id="line-2499"></span> |
| <span class="source-line-no">2500</span><span id="line-2500"> /**</span> |
| <span class="source-line-no">2501</span><span id="line-2501"> * <i><l>Context</l> configuration property:&emsp;</i> Locale.</span> |
| <span class="source-line-no">2502</span><span id="line-2502"> *</span> |
| <span class="source-line-no">2503</span><span id="line-2503"> * <p></span> |
| <span class="source-line-no">2504</span><span id="line-2504"> * Specifies the default locale for serializer and parser sessions when not specified via {@link BeanSession.Builder#locale(Locale)}.</span> |
| <span class="source-line-no">2505</span><span id="line-2505"> * Typically used for POJO swaps that need to deal with locales such as swaps that convert <l>Date</l> and <l>Calendar</l></span> |
| <span class="source-line-no">2506</span><span id="line-2506"> * objects to strings by accessing it via the session passed into the {@link ObjectSwap#swap(BeanSession, Object)} and</span> |
| <span class="source-line-no">2507</span><span id="line-2507"> * {@link ObjectSwap#unswap(BeanSession, Object, ClassMeta, String)} methods.</span> |
| <span class="source-line-no">2508</span><span id="line-2508"> *</span> |
| <span class="source-line-no">2509</span><span id="line-2509"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2510</span><span id="line-2510"> * <p class='bjava'></span> |
| <span class="source-line-no">2511</span><span id="line-2511"> * <jc>// Define a POJO swap that skips serializing beans if we're in the UK.</jc></span> |
| <span class="source-line-no">2512</span><span id="line-2512"> * <jk>public class</jk> MyBeanSwap <jk>extends</jk> StringSwap&lt;MyBean&gt; {</span> |
| <span class="source-line-no">2513</span><span id="line-2513"> * <ja>@Override</ja></span> |
| <span class="source-line-no">2514</span><span id="line-2514"> * <jk>public</jk> String swap(BeanSession <jv>session</jv>, MyBean <jv>bean</jv>) <jk>throws</jk> Exception {</span> |
| <span class="source-line-no">2515</span><span id="line-2515"> * <jk>if</jk> (<jv>session</jv>.getLocale().equals(Locale.<jsf>UK</jsf>))</span> |
| <span class="source-line-no">2516</span><span id="line-2516"> * <jk>return null</jk>;</span> |
| <span class="source-line-no">2517</span><span id="line-2517"> * <jk>return</jk> <jv>bean</jv>.toString();</span> |
| <span class="source-line-no">2518</span><span id="line-2518"> * }</span> |
| <span class="source-line-no">2519</span><span id="line-2519"> * }</span> |
| <span class="source-line-no">2520</span><span id="line-2520"> *</span> |
| <span class="source-line-no">2521</span><span id="line-2521"> * <jc>// Create a serializer that uses the specified locale if it's not passed in through session args.</jc></span> |
| <span class="source-line-no">2522</span><span id="line-2522"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2523</span><span id="line-2523"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2524</span><span id="line-2524"> * .locale(Locale.<jsf>UK</jsf>)</span> |
| <span class="source-line-no">2525</span><span id="line-2525"> * .swaps(MyBeanSwap.<jk>class</jk>)</span> |
| <span class="source-line-no">2526</span><span id="line-2526"> * .build();</span> |
| <span class="source-line-no">2527</span><span id="line-2527"> * </p></span> |
| <span class="source-line-no">2528</span><span id="line-2528"> *</span> |
| <span class="source-line-no">2529</span><span id="line-2529"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">2530</span><span id="line-2530"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#locale()}</span> |
| <span class="source-line-no">2531</span><span id="line-2531"> * <li class='jm'>{@link org.apache.juneau.BeanSession.Builder#locale(Locale)}</span> |
| <span class="source-line-no">2532</span><span id="line-2532"> * </ul></span> |
| <span class="source-line-no">2533</span><span id="line-2533"> *</span> |
| <span class="source-line-no">2534</span><span id="line-2534"> * @param value The new value for this property.</span> |
| <span class="source-line-no">2535</span><span id="line-2535"> * @return This object.</span> |
| <span class="source-line-no">2536</span><span id="line-2536"> */</span> |
| <span class="source-line-no">2537</span><span id="line-2537"> @FluentSetter</span> |
| <span class="source-line-no">2538</span><span id="line-2538"> public Builder locale(Locale value) {</span> |
| <span class="source-line-no">2539</span><span id="line-2539"> locale = value;</span> |
| <span class="source-line-no">2540</span><span id="line-2540"> return this;</span> |
| <span class="source-line-no">2541</span><span id="line-2541"> }</span> |
| <span class="source-line-no">2542</span><span id="line-2542"></span> |
| <span class="source-line-no">2543</span><span id="line-2543"> /**</span> |
| <span class="source-line-no">2544</span><span id="line-2544"> * <i><l>Context</l> configuration property:&emsp;</i> Media type.</span> |
| <span class="source-line-no">2545</span><span id="line-2545"> *</span> |
| <span class="source-line-no">2546</span><span id="line-2546"> * <p></span> |
| <span class="source-line-no">2547</span><span id="line-2547"> * Specifies the default media type for serializer and parser sessions when not specified via {@link BeanSession.Builder#mediaType(MediaType)}.</span> |
| <span class="source-line-no">2548</span><span id="line-2548"> * Typically used for POJO swaps that need to serialize the same POJO classes differently depending on</span> |
| <span class="source-line-no">2549</span><span id="line-2549"> * the specific requested media type. For example, a swap could handle a request for media types <js>"application/json"</js></span> |
| <span class="source-line-no">2550</span><span id="line-2550"> * and <js>"application/json+foo"</js> slightly differently even though they're both being handled by the same JSON</span> |
| <span class="source-line-no">2551</span><span id="line-2551"> * serializer or parser.</span> |
| <span class="source-line-no">2552</span><span id="line-2552"> *</span> |
| <span class="source-line-no">2553</span><span id="line-2553"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2554</span><span id="line-2554"> * <p class='bjava'></span> |
| <span class="source-line-no">2555</span><span id="line-2555"> * <jc>// Define a POJO swap that skips serializing beans if the media type is application/json.</jc></span> |
| <span class="source-line-no">2556</span><span id="line-2556"> * <jk>public class</jk> MyBeanSwap <jk>extends</jk> StringSwap&lt;MyBean&gt; {</span> |
| <span class="source-line-no">2557</span><span id="line-2557"> * <ja>@Override</ja></span> |
| <span class="source-line-no">2558</span><span id="line-2558"> * <jk>public</jk> String swap(BeanSession <jv>session</jv>, MyBean <jv>bean</jv>) <jk>throws</jk> Exception {</span> |
| <span class="source-line-no">2559</span><span id="line-2559"> * <jk>if</jk> (<jv>session</jv>.getMediaType().equals(<js>"application/json"</js>))</span> |
| <span class="source-line-no">2560</span><span id="line-2560"> * <jk>return null</jk>;</span> |
| <span class="source-line-no">2561</span><span id="line-2561"> * <jk>return</jk> <jv>bean</jv>.toString();</span> |
| <span class="source-line-no">2562</span><span id="line-2562"> * }</span> |
| <span class="source-line-no">2563</span><span id="line-2563"> * }</span> |
| <span class="source-line-no">2564</span><span id="line-2564"> *</span> |
| <span class="source-line-no">2565</span><span id="line-2565"> * <jc>// Create a serializer that uses the specified media type if it's not passed in through session args.</jc></span> |
| <span class="source-line-no">2566</span><span id="line-2566"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2567</span><span id="line-2567"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2568</span><span id="line-2568"> * .mediaType(MediaType.<jsf>JSON</jsf>)</span> |
| <span class="source-line-no">2569</span><span id="line-2569"> * .build();</span> |
| <span class="source-line-no">2570</span><span id="line-2570"> * </p></span> |
| <span class="source-line-no">2571</span><span id="line-2571"> *</span> |
| <span class="source-line-no">2572</span><span id="line-2572"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">2573</span><span id="line-2573"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#mediaType()}</span> |
| <span class="source-line-no">2574</span><span id="line-2574"> * <li class='jm'>{@link org.apache.juneau.BeanSession.Builder#mediaType(MediaType)}</span> |
| <span class="source-line-no">2575</span><span id="line-2575"> * </ul></span> |
| <span class="source-line-no">2576</span><span id="line-2576"> *</span> |
| <span class="source-line-no">2577</span><span id="line-2577"> * @param value The new value for this property.</span> |
| <span class="source-line-no">2578</span><span id="line-2578"> * @return This object.</span> |
| <span class="source-line-no">2579</span><span id="line-2579"> */</span> |
| <span class="source-line-no">2580</span><span id="line-2580"> @FluentSetter</span> |
| <span class="source-line-no">2581</span><span id="line-2581"> public Builder mediaType(MediaType value) {</span> |
| <span class="source-line-no">2582</span><span id="line-2582"> mediaType = value;</span> |
| <span class="source-line-no">2583</span><span id="line-2583"> return this;</span> |
| <span class="source-line-no">2584</span><span id="line-2584"> }</span> |
| <span class="source-line-no">2585</span><span id="line-2585"></span> |
| <span class="source-line-no">2586</span><span id="line-2586"> /**</span> |
| <span class="source-line-no">2587</span><span id="line-2587"> * Bean class exclusions.</span> |
| <span class="source-line-no">2588</span><span id="line-2588"> *</span> |
| <span class="source-line-no">2589</span><span id="line-2589"> * <p></span> |
| <span class="source-line-no">2590</span><span id="line-2590"> * List of classes that should not be treated as beans even if they appear to be bean-like.</span> |
| <span class="source-line-no">2591</span><span id="line-2591"> * Not-bean classes are converted to <c>Strings</c> during serialization.</span> |
| <span class="source-line-no">2592</span><span id="line-2592"> *</span> |
| <span class="source-line-no">2593</span><span id="line-2593"> * <p></span> |
| <span class="source-line-no">2594</span><span id="line-2594"> * Values can consist of any of the following types:</span> |
| <span class="source-line-no">2595</span><span id="line-2595"> * <ul></span> |
| <span class="source-line-no">2596</span><span id="line-2596"> * <li>Classes.</span> |
| <span class="source-line-no">2597</span><span id="line-2597"> * <li>Arrays and collections of classes.</span> |
| <span class="source-line-no">2598</span><span id="line-2598"> * </ul></span> |
| <span class="source-line-no">2599</span><span id="line-2599"> *</span> |
| <span class="source-line-no">2600</span><span id="line-2600"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2601</span><span id="line-2601"> * <p class='bjava'></span> |
| <span class="source-line-no">2602</span><span id="line-2602"> * <jc>// A bean with a single property.</jc></span> |
| <span class="source-line-no">2603</span><span id="line-2603"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">2604</span><span id="line-2604"> * <jk>public</jk> String <jf>foo</jf> = <js>"bar"</js>;</span> |
| <span class="source-line-no">2605</span><span id="line-2605"> *</span> |
| <span class="source-line-no">2606</span><span id="line-2606"> * <jk>public</jk> String toString() {</span> |
| <span class="source-line-no">2607</span><span id="line-2607"> * <jk>return</jk> <js>"baz"</js>;</span> |
| <span class="source-line-no">2608</span><span id="line-2608"> * }</span> |
| <span class="source-line-no">2609</span><span id="line-2609"> * }</span> |
| <span class="source-line-no">2610</span><span id="line-2610"> *</span> |
| <span class="source-line-no">2611</span><span id="line-2611"> * <jc>// Create a serializer that doesn't treat MyBean as a bean class.</jc></span> |
| <span class="source-line-no">2612</span><span id="line-2612"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2613</span><span id="line-2613"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2614</span><span id="line-2614"> * .notBeanClasses(MyBean.<jk>class</jk>)</span> |
| <span class="source-line-no">2615</span><span id="line-2615"> * .build();</span> |
| <span class="source-line-no">2616</span><span id="line-2616"> *</span> |
| <span class="source-line-no">2617</span><span id="line-2617"> * <jc>// Produces "baz" instead of {"foo":"bar"}</jc></span> |
| <span class="source-line-no">2618</span><span id="line-2618"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">2619</span><span id="line-2619"> * </p></span> |
| <span class="source-line-no">2620</span><span id="line-2620"> *</span> |
| <span class="source-line-no">2621</span><span id="line-2621"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">2622</span><span id="line-2622"> * <li class='note'>The {@link BeanIgnore @BeanIgnore} annotation can also be used on classes to prevent them from being recognized as beans.</span> |
| <span class="source-line-no">2623</span><span id="line-2623"> * </ul></span> |
| <span class="source-line-no">2624</span><span id="line-2624"> *</span> |
| <span class="source-line-no">2625</span><span id="line-2625"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">2626</span><span id="line-2626"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanIgnore}</span> |
| <span class="source-line-no">2627</span><span id="line-2627"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#notBeanClasses()}</span> |
| <span class="source-line-no">2628</span><span id="line-2628"> * </ul></span> |
| <span class="source-line-no">2629</span><span id="line-2629"> *</span> |
| <span class="source-line-no">2630</span><span id="line-2630"> * @param values</span> |
| <span class="source-line-no">2631</span><span id="line-2631"> * The values to add to this setting.</span> |
| <span class="source-line-no">2632</span><span id="line-2632"> * <br>Values can consist of any of the following types:</span> |
| <span class="source-line-no">2633</span><span id="line-2633"> * <ul></span> |
| <span class="source-line-no">2634</span><span id="line-2634"> * <li>Classes.</span> |
| <span class="source-line-no">2635</span><span id="line-2635"> * <li>Arrays and collections of classes.</span> |
| <span class="source-line-no">2636</span><span id="line-2636"> * </ul></span> |
| <span class="source-line-no">2637</span><span id="line-2637"> * @return This object.</span> |
| <span class="source-line-no">2638</span><span id="line-2638"> */</span> |
| <span class="source-line-no">2639</span><span id="line-2639"> @FluentSetter</span> |
| <span class="source-line-no">2640</span><span id="line-2640"> public Builder notBeanClasses(Class<?>...values) {</span> |
| <span class="source-line-no">2641</span><span id="line-2641"> return notBeanClasses(alist(values));</span> |
| <span class="source-line-no">2642</span><span id="line-2642"> }</span> |
| <span class="source-line-no">2643</span><span id="line-2643"></span> |
| <span class="source-line-no">2644</span><span id="line-2644"> /**</span> |
| <span class="source-line-no">2645</span><span id="line-2645"> * Same as {@link #notBeanClasses(Class...)} but allows you to pass in a collection of classes.</span> |
| <span class="source-line-no">2646</span><span id="line-2646"> *</span> |
| <span class="source-line-no">2647</span><span id="line-2647"> * @param values</span> |
| <span class="source-line-no">2648</span><span id="line-2648"> * The values to add to this setting.</span> |
| <span class="source-line-no">2649</span><span id="line-2649"> * @return This object.</span> |
| <span class="source-line-no">2650</span><span id="line-2650"> * @see #notBeanClasses(Class...)</span> |
| <span class="source-line-no">2651</span><span id="line-2651"> */</span> |
| <span class="source-line-no">2652</span><span id="line-2652"> @FluentSetter</span> |
| <span class="source-line-no">2653</span><span id="line-2653"> public Builder notBeanClasses(Collection<Class<?>> values) {</span> |
| <span class="source-line-no">2654</span><span id="line-2654"> notBeanClasses().addAll(values);</span> |
| <span class="source-line-no">2655</span><span id="line-2655"> return this;</span> |
| <span class="source-line-no">2656</span><span id="line-2656"> }</span> |
| <span class="source-line-no">2657</span><span id="line-2657"></span> |
| <span class="source-line-no">2658</span><span id="line-2658"> /**</span> |
| <span class="source-line-no">2659</span><span id="line-2659"> * Returns the list of not-bean classes.</span> |
| <span class="source-line-no">2660</span><span id="line-2660"> *</span> |
| <span class="source-line-no">2661</span><span id="line-2661"> * <p></span> |
| <span class="source-line-no">2662</span><span id="line-2662"> * Gives access to the inner list if you need to make more than simple additions via {@link #notBeanClasses(Class...)}.</span> |
| <span class="source-line-no">2663</span><span id="line-2663"> *</span> |
| <span class="source-line-no">2664</span><span id="line-2664"> * @return The list of not-bean classes.</span> |
| <span class="source-line-no">2665</span><span id="line-2665"> * @see #notBeanClasses(Class...)</span> |
| <span class="source-line-no">2666</span><span id="line-2666"> */</span> |
| <span class="source-line-no">2667</span><span id="line-2667"> public Set<Class<?>> notBeanClasses() {</span> |
| <span class="source-line-no">2668</span><span id="line-2668"> if (notBeanClasses == null)</span> |
| <span class="source-line-no">2669</span><span id="line-2669"> notBeanClasses = classSet();</span> |
| <span class="source-line-no">2670</span><span id="line-2670"> return notBeanClasses;</span> |
| <span class="source-line-no">2671</span><span id="line-2671"> }</span> |
| <span class="source-line-no">2672</span><span id="line-2672"></span> |
| <span class="source-line-no">2673</span><span id="line-2673"> /**</span> |
| <span class="source-line-no">2674</span><span id="line-2674"> * Bean package exclusions.</span> |
| <span class="source-line-no">2675</span><span id="line-2675"> *</span> |
| <span class="source-line-no">2676</span><span id="line-2676"> * <p></span> |
| <span class="source-line-no">2677</span><span id="line-2677"> * Used as a convenient way of defining the {@link #notBeanClasses(Class...)} property for entire packages.</span> |
| <span class="source-line-no">2678</span><span id="line-2678"> * Any classes within these packages will be serialized to strings using {@link Object#toString()}.</span> |
| <span class="source-line-no">2679</span><span id="line-2679"> *</span> |
| <span class="source-line-no">2680</span><span id="line-2680"> * <p></span> |
| <span class="source-line-no">2681</span><span id="line-2681"> * Note that you can specify suffix patterns to include all subpackages.</span> |
| <span class="source-line-no">2682</span><span id="line-2682"> *</span> |
| <span class="source-line-no">2683</span><span id="line-2683"> * <p></span> |
| <span class="source-line-no">2684</span><span id="line-2684"> * Values can consist of any of the following types:</span> |
| <span class="source-line-no">2685</span><span id="line-2685"> * <ul></span> |
| <span class="source-line-no">2686</span><span id="line-2686"> * <li>Strings.</span> |
| <span class="source-line-no">2687</span><span id="line-2687"> * <li>Arrays and collections of strings.</span> |
| <span class="source-line-no">2688</span><span id="line-2688"> * </ul></span> |
| <span class="source-line-no">2689</span><span id="line-2689"> *</span> |
| <span class="source-line-no">2690</span><span id="line-2690"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2691</span><span id="line-2691"> * <p class='bjava'></span> |
| <span class="source-line-no">2692</span><span id="line-2692"> * <jc>// Create a serializer that ignores beans in the specified packages.</jc></span> |
| <span class="source-line-no">2693</span><span id="line-2693"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2694</span><span id="line-2694"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2695</span><span id="line-2695"> * .notBeanPackages(<js>"org.apache.foo"</js>, <js>"org.apache.bar.*"</js>)</span> |
| <span class="source-line-no">2696</span><span id="line-2696"> * .build();</span> |
| <span class="source-line-no">2697</span><span id="line-2697"> * </p></span> |
| <span class="source-line-no">2698</span><span id="line-2698"> *</span> |
| <span class="source-line-no">2699</span><span id="line-2699"> * @param values</span> |
| <span class="source-line-no">2700</span><span id="line-2700"> * The values to add to this setting.</span> |
| <span class="source-line-no">2701</span><span id="line-2701"> * <br>Values can consist of any of the following types:</span> |
| <span class="source-line-no">2702</span><span id="line-2702"> * <ul></span> |
| <span class="source-line-no">2703</span><span id="line-2703"> * <li>{@link Package} objects.</span> |
| <span class="source-line-no">2704</span><span id="line-2704"> * <li>Strings.</span> |
| <span class="source-line-no">2705</span><span id="line-2705"> * <li>Arrays and collections of anything in this list.</span> |
| <span class="source-line-no">2706</span><span id="line-2706"> * </ul></span> |
| <span class="source-line-no">2707</span><span id="line-2707"> * @return This object.</span> |
| <span class="source-line-no">2708</span><span id="line-2708"> */</span> |
| <span class="source-line-no">2709</span><span id="line-2709"> @FluentSetter</span> |
| <span class="source-line-no">2710</span><span id="line-2710"> public Builder notBeanPackages(String...values) {</span> |
| <span class="source-line-no">2711</span><span id="line-2711"> return notBeanPackages(alist(values));</span> |
| <span class="source-line-no">2712</span><span id="line-2712"> }</span> |
| <span class="source-line-no">2713</span><span id="line-2713"></span> |
| <span class="source-line-no">2714</span><span id="line-2714"> /**</span> |
| <span class="source-line-no">2715</span><span id="line-2715"> * Same as {@link #notBeanPackages(String...)} but allows you to pass in a collection of classes.</span> |
| <span class="source-line-no">2716</span><span id="line-2716"> *</span> |
| <span class="source-line-no">2717</span><span id="line-2717"> * @param values</span> |
| <span class="source-line-no">2718</span><span id="line-2718"> * The values to add to this setting.</span> |
| <span class="source-line-no">2719</span><span id="line-2719"> * @return This object.</span> |
| <span class="source-line-no">2720</span><span id="line-2720"> * @see #notBeanPackages(String...)</span> |
| <span class="source-line-no">2721</span><span id="line-2721"> */</span> |
| <span class="source-line-no">2722</span><span id="line-2722"> @FluentSetter</span> |
| <span class="source-line-no">2723</span><span id="line-2723"> public Builder notBeanPackages(Collection<String> values) {</span> |
| <span class="source-line-no">2724</span><span id="line-2724"> notBeanPackages().addAll(values);</span> |
| <span class="source-line-no">2725</span><span id="line-2725"> return this;</span> |
| <span class="source-line-no">2726</span><span id="line-2726"> }</span> |
| <span class="source-line-no">2727</span><span id="line-2727"></span> |
| <span class="source-line-no">2728</span><span id="line-2728"> /**</span> |
| <span class="source-line-no">2729</span><span id="line-2729"> * Returns the list of not-bean Java package names.</span> |
| <span class="source-line-no">2730</span><span id="line-2730"> *</span> |
| <span class="source-line-no">2731</span><span id="line-2731"> * <p></span> |
| <span class="source-line-no">2732</span><span id="line-2732"> * Gives access to the inner list if you need to make more than simple additions via {@link #notBeanPackages(String...)}.</span> |
| <span class="source-line-no">2733</span><span id="line-2733"> *</span> |
| <span class="source-line-no">2734</span><span id="line-2734"> * @return The list of not-bean Java package names.</span> |
| <span class="source-line-no">2735</span><span id="line-2735"> * @see #notBeanPackages(String...)</span> |
| <span class="source-line-no">2736</span><span id="line-2736"> */</span> |
| <span class="source-line-no">2737</span><span id="line-2737"> public Set<String> notBeanPackages() {</span> |
| <span class="source-line-no">2738</span><span id="line-2738"> if (notBeanPackages == null)</span> |
| <span class="source-line-no">2739</span><span id="line-2739"> notBeanPackages = new TreeSet<>();</span> |
| <span class="source-line-no">2740</span><span id="line-2740"> return notBeanPackages;</span> |
| <span class="source-line-no">2741</span><span id="line-2741"> }</span> |
| <span class="source-line-no">2742</span><span id="line-2742"></span> |
| <span class="source-line-no">2743</span><span id="line-2743"> /**</span> |
| <span class="source-line-no">2744</span><span id="line-2744"> * Bean property namer</span> |
| <span class="source-line-no">2745</span><span id="line-2745"> *</span> |
| <span class="source-line-no">2746</span><span id="line-2746"> * <p></span> |
| <span class="source-line-no">2747</span><span id="line-2747"> * The class to use for calculating bean property names.</span> |
| <span class="source-line-no">2748</span><span id="line-2748"> *</span> |
| <span class="source-line-no">2749</span><span id="line-2749"> * <p></span> |
| <span class="source-line-no">2750</span><span id="line-2750"> * Predefined classes:</span> |
| <span class="source-line-no">2751</span><span id="line-2751"> * <ul></span> |
| <span class="source-line-no">2752</span><span id="line-2752"> * <li>{@link BasicPropertyNamer} - Default.</span> |
| <span class="source-line-no">2753</span><span id="line-2753"> * <li>{@link PropertyNamerDLC} - Dashed-lower-case names.</span> |
| <span class="source-line-no">2754</span><span id="line-2754"> * <li>{@link PropertyNamerULC} - Dashed-upper-case names.</span> |
| <span class="source-line-no">2755</span><span id="line-2755"> * </ul></span> |
| <span class="source-line-no">2756</span><span id="line-2756"> *</span> |
| <span class="source-line-no">2757</span><span id="line-2757"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2758</span><span id="line-2758"> * <p class='bjava'></span> |
| <span class="source-line-no">2759</span><span id="line-2759"> * <jc>// A bean with a single property.</jc></span> |
| <span class="source-line-no">2760</span><span id="line-2760"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">2761</span><span id="line-2761"> * <jk>public</jk> String <jf>fooBarBaz</jf> = <js>"fooBarBaz"</js>;</span> |
| <span class="source-line-no">2762</span><span id="line-2762"> * }</span> |
| <span class="source-line-no">2763</span><span id="line-2763"> *</span> |
| <span class="source-line-no">2764</span><span id="line-2764"> * <jc>// Create a serializer that uses Dashed-Lower-Case property names.</jc></span> |
| <span class="source-line-no">2765</span><span id="line-2765"> * <jc>// (e.g. "foo-bar-baz" instead of "fooBarBaz")</jc></span> |
| <span class="source-line-no">2766</span><span id="line-2766"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2767</span><span id="line-2767"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2768</span><span id="line-2768"> * .propertyNamer(PropertyNamerDLC.<jk>class</jk>)</span> |
| <span class="source-line-no">2769</span><span id="line-2769"> * .build();</span> |
| <span class="source-line-no">2770</span><span id="line-2770"> *</span> |
| <span class="source-line-no">2771</span><span id="line-2771"> * <jc>// Produces: {"foo-bar-baz":"fooBarBaz"}</jc></span> |
| <span class="source-line-no">2772</span><span id="line-2772"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">2773</span><span id="line-2773"> * </p></span> |
| <span class="source-line-no">2774</span><span id="line-2774"> *</span> |
| <span class="source-line-no">2775</span><span id="line-2775"> * @param value</span> |
| <span class="source-line-no">2776</span><span id="line-2776"> * The new value for this setting.</span> |
| <span class="source-line-no">2777</span><span id="line-2777"> * <br>The default is {@link BasicPropertyNamer}.</span> |
| <span class="source-line-no">2778</span><span id="line-2778"> * @return This object.</span> |
| <span class="source-line-no">2779</span><span id="line-2779"> */</span> |
| <span class="source-line-no">2780</span><span id="line-2780"> @FluentSetter</span> |
| <span class="source-line-no">2781</span><span id="line-2781"> public Builder propertyNamer(Class<? extends PropertyNamer> value) {</span> |
| <span class="source-line-no">2782</span><span id="line-2782"> propertyNamer = value;</span> |
| <span class="source-line-no">2783</span><span id="line-2783"> return this;</span> |
| <span class="source-line-no">2784</span><span id="line-2784"> }</span> |
| <span class="source-line-no">2785</span><span id="line-2785"></span> |
| <span class="source-line-no">2786</span><span id="line-2786"> /**</span> |
| <span class="source-line-no">2787</span><span id="line-2787"> * Bean property namer</span> |
| <span class="source-line-no">2788</span><span id="line-2788"> *</span> |
| <span class="source-line-no">2789</span><span id="line-2789"> * <p></span> |
| <span class="source-line-no">2790</span><span id="line-2790"> * Same as {@link #propertyNamer(Class)} but allows you to specify a namer for a specific class.</span> |
| <span class="source-line-no">2791</span><span id="line-2791"> *</span> |
| <span class="source-line-no">2792</span><span id="line-2792"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2793</span><span id="line-2793"> * <p class='bjava'></span> |
| <span class="source-line-no">2794</span><span id="line-2794"> * <jc>// A bean with a single property.</jc></span> |
| <span class="source-line-no">2795</span><span id="line-2795"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">2796</span><span id="line-2796"> * <jk>public</jk> String <jf>fooBarBaz</jf> = <js>"fooBarBaz"</js>;</span> |
| <span class="source-line-no">2797</span><span id="line-2797"> * }</span> |
| <span class="source-line-no">2798</span><span id="line-2798"> *</span> |
| <span class="source-line-no">2799</span><span id="line-2799"> * <jc>// Create a serializer that uses Dashed-Lower-Case property names for the MyBean class only.</jc></span> |
| <span class="source-line-no">2800</span><span id="line-2800"> * <jc>// (e.g. "foo-bar-baz" instead of "fooBarBaz")</jc></span> |
| <span class="source-line-no">2801</span><span id="line-2801"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2802</span><span id="line-2802"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2803</span><span id="line-2803"> * .propertyNamer(MyBean.<jk>class</jk>, PropertyNamerDLC.<jk>class</jk>)</span> |
| <span class="source-line-no">2804</span><span id="line-2804"> * .build();</span> |
| <span class="source-line-no">2805</span><span id="line-2805"> *</span> |
| <span class="source-line-no">2806</span><span id="line-2806"> * <jc>// Produces: {"foo-bar-baz":"fooBarBaz"}</jc></span> |
| <span class="source-line-no">2807</span><span id="line-2807"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">2808</span><span id="line-2808"> * </p></span> |
| <span class="source-line-no">2809</span><span id="line-2809"> *</span> |
| <span class="source-line-no">2810</span><span id="line-2810"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">2811</span><span id="line-2811"> * <li class='ja'>{@link Bean#propertyNamer() Bean(propertyNamer)}</span> |
| <span class="source-line-no">2812</span><span id="line-2812"> * <li class='jm'>{@link #propertyNamer(Class)}</span> |
| <span class="source-line-no">2813</span><span id="line-2813"> * </ul></span> |
| <span class="source-line-no">2814</span><span id="line-2814"> *</span> |
| <span class="source-line-no">2815</span><span id="line-2815"> * @param on The class that the namer applies to.</span> |
| <span class="source-line-no">2816</span><span id="line-2816"> * @param value</span> |
| <span class="source-line-no">2817</span><span id="line-2817"> * The new value for this setting.</span> |
| <span class="source-line-no">2818</span><span id="line-2818"> * <br>The default is {@link BasicPropertyNamer}.</span> |
| <span class="source-line-no">2819</span><span id="line-2819"> * @return This object.</span> |
| <span class="source-line-no">2820</span><span id="line-2820"> */</span> |
| <span class="source-line-no">2821</span><span id="line-2821"> @FluentSetter</span> |
| <span class="source-line-no">2822</span><span id="line-2822"> public Builder propertyNamer(Class<?> on, Class<? extends PropertyNamer> value) {</span> |
| <span class="source-line-no">2823</span><span id="line-2823"> return annotations(BeanAnnotation.create(on).propertyNamer(value).build());</span> |
| <span class="source-line-no">2824</span><span id="line-2824"> }</span> |
| <span class="source-line-no">2825</span><span id="line-2825"></span> |
| <span class="source-line-no">2826</span><span id="line-2826"> /**</span> |
| <span class="source-line-no">2827</span><span id="line-2827"> * Sort bean properties.</span> |
| <span class="source-line-no">2828</span><span id="line-2828"> *</span> |
| <span class="source-line-no">2829</span><span id="line-2829"> * <p></span> |
| <span class="source-line-no">2830</span><span id="line-2830"> * When enabled, all bean properties will be serialized and access in alphabetical order.</span> |
| <span class="source-line-no">2831</span><span id="line-2831"> * Otherwise, the natural order of the bean properties is used which is dependent on the JVM vendor.</span> |
| <span class="source-line-no">2832</span><span id="line-2832"> * On IBM JVMs, the bean properties are ordered based on their ordering in the Java file.</span> |
| <span class="source-line-no">2833</span><span id="line-2833"> * On Oracle JVMs, the bean properties are not ordered (which follows the official JVM specs).</span> |
| <span class="source-line-no">2834</span><span id="line-2834"> *</span> |
| <span class="source-line-no">2835</span><span id="line-2835"> * <p></span> |
| <span class="source-line-no">2836</span><span id="line-2836"> * this setting is disabled by default so that IBM JVM users don't have to use {@link Bean @Bean} annotations</span> |
| <span class="source-line-no">2837</span><span id="line-2837"> * to force bean properties to be in a particular order and can just alter the order of the fields/methods</span> |
| <span class="source-line-no">2838</span><span id="line-2838"> * in the Java file.</span> |
| <span class="source-line-no">2839</span><span id="line-2839"> *</span> |
| <span class="source-line-no">2840</span><span id="line-2840"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2841</span><span id="line-2841"> * <p class='bjava'></span> |
| <span class="source-line-no">2842</span><span id="line-2842"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">2843</span><span id="line-2843"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">2844</span><span id="line-2844"> * <jk>public</jk> String <jf>c</jf> = <js>"1"</js>;</span> |
| <span class="source-line-no">2845</span><span id="line-2845"> * <jk>public</jk> String <jf>b</jf> = <js>"2"</js>;</span> |
| <span class="source-line-no">2846</span><span id="line-2846"> * <jk>public</jk> String <jf>a</jf> = <js>"3"</js>;</span> |
| <span class="source-line-no">2847</span><span id="line-2847"> * }</span> |
| <span class="source-line-no">2848</span><span id="line-2848"> *</span> |
| <span class="source-line-no">2849</span><span id="line-2849"> * <jc>// Create a serializer that sorts bean properties.</jc></span> |
| <span class="source-line-no">2850</span><span id="line-2850"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2851</span><span id="line-2851"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2852</span><span id="line-2852"> * .sortProperties()</span> |
| <span class="source-line-no">2853</span><span id="line-2853"> * .build();</span> |
| <span class="source-line-no">2854</span><span id="line-2854"> *</span> |
| <span class="source-line-no">2855</span><span id="line-2855"> * <jc>// Produces: {"a":"3","b":"2","c":"1"}</jc></span> |
| <span class="source-line-no">2856</span><span id="line-2856"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">2857</span><span id="line-2857"> * </p></span> |
| <span class="source-line-no">2858</span><span id="line-2858"> *</span> |
| <span class="source-line-no">2859</span><span id="line-2859"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">2860</span><span id="line-2860"> * <li class='note'>The {@link Bean#sort() @Bean.sort()} annotation can also be used to sort properties on just a single class.</span> |
| <span class="source-line-no">2861</span><span id="line-2861"> * </ul></span> |
| <span class="source-line-no">2862</span><span id="line-2862"> *</span> |
| <span class="source-line-no">2863</span><span id="line-2863"> * @return This object.</span> |
| <span class="source-line-no">2864</span><span id="line-2864"> */</span> |
| <span class="source-line-no">2865</span><span id="line-2865"> @FluentSetter</span> |
| <span class="source-line-no">2866</span><span id="line-2866"> public Builder sortProperties() {</span> |
| <span class="source-line-no">2867</span><span id="line-2867"> sortProperties = true;</span> |
| <span class="source-line-no">2868</span><span id="line-2868"> return sortProperties(true);</span> |
| <span class="source-line-no">2869</span><span id="line-2869"> }</span> |
| <span class="source-line-no">2870</span><span id="line-2870"></span> |
| <span class="source-line-no">2871</span><span id="line-2871"> /**</span> |
| <span class="source-line-no">2872</span><span id="line-2872"> * Same as {@link #sortProperties()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">2873</span><span id="line-2873"> *</span> |
| <span class="source-line-no">2874</span><span id="line-2874"> * @param value The value for this setting.</span> |
| <span class="source-line-no">2875</span><span id="line-2875"> * @return This object.</span> |
| <span class="source-line-no">2876</span><span id="line-2876"> */</span> |
| <span class="source-line-no">2877</span><span id="line-2877"> @FluentSetter</span> |
| <span class="source-line-no">2878</span><span id="line-2878"> public Builder sortProperties(boolean value) {</span> |
| <span class="source-line-no">2879</span><span id="line-2879"> sortProperties = value;</span> |
| <span class="source-line-no">2880</span><span id="line-2880"> return this;</span> |
| <span class="source-line-no">2881</span><span id="line-2881"> }</span> |
| <span class="source-line-no">2882</span><span id="line-2882"></span> |
| <span class="source-line-no">2883</span><span id="line-2883"> /**</span> |
| <span class="source-line-no">2884</span><span id="line-2884"> * Sort bean properties.</span> |
| <span class="source-line-no">2885</span><span id="line-2885"> *</span> |
| <span class="source-line-no">2886</span><span id="line-2886"> * <p></span> |
| <span class="source-line-no">2887</span><span id="line-2887"> * Same as {@link #sortProperties()} but allows you to specify individual bean classes instead of globally.</span> |
| <span class="source-line-no">2888</span><span id="line-2888"> *</span> |
| <span class="source-line-no">2889</span><span id="line-2889"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2890</span><span id="line-2890"> * <p class='bjava'></span> |
| <span class="source-line-no">2891</span><span id="line-2891"> * <jc>// A bean with 3 properties.</jc></span> |
| <span class="source-line-no">2892</span><span id="line-2892"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">2893</span><span id="line-2893"> * <jk>public</jk> String <jf>c</jf> = <js>"1"</js>;</span> |
| <span class="source-line-no">2894</span><span id="line-2894"> * <jk>public</jk> String <jf>b</jf> = <js>"2"</js>;</span> |
| <span class="source-line-no">2895</span><span id="line-2895"> * <jk>public</jk> String <jf>a</jf> = <js>"3"</js>;</span> |
| <span class="source-line-no">2896</span><span id="line-2896"> * }</span> |
| <span class="source-line-no">2897</span><span id="line-2897"> *</span> |
| <span class="source-line-no">2898</span><span id="line-2898"> * <jc>// Create a serializer that sorts properties on MyBean.</jc></span> |
| <span class="source-line-no">2899</span><span id="line-2899"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2900</span><span id="line-2900"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2901</span><span id="line-2901"> * .sortProperties(MyBean.<jk>class</jk>)</span> |
| <span class="source-line-no">2902</span><span id="line-2902"> * .build();</span> |
| <span class="source-line-no">2903</span><span id="line-2903"> *</span> |
| <span class="source-line-no">2904</span><span id="line-2904"> * <jc>// Produces: {"a":"3","b":"2","c":"1"}</jc></span> |
| <span class="source-line-no">2905</span><span id="line-2905"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">2906</span><span id="line-2906"> * </p></span> |
| <span class="source-line-no">2907</span><span id="line-2907"> *</span> |
| <span class="source-line-no">2908</span><span id="line-2908"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">2909</span><span id="line-2909"> * <li class='ja'>{@link Bean#sort() Bean(sort)}</span> |
| <span class="source-line-no">2910</span><span id="line-2910"> * <li class='jm'>{@link #sortProperties()}</span> |
| <span class="source-line-no">2911</span><span id="line-2911"> * </ul></span> |
| <span class="source-line-no">2912</span><span id="line-2912"> *</span> |
| <span class="source-line-no">2913</span><span id="line-2913"> * @param on The bean classes to sort properties on.</span> |
| <span class="source-line-no">2914</span><span id="line-2914"> * @return This object.</span> |
| <span class="source-line-no">2915</span><span id="line-2915"> */</span> |
| <span class="source-line-no">2916</span><span id="line-2916"> @FluentSetter</span> |
| <span class="source-line-no">2917</span><span id="line-2917"> public Builder sortProperties(Class<?>...on) {</span> |
| <span class="source-line-no">2918</span><span id="line-2918"> for (Class<?> c : on)</span> |
| <span class="source-line-no">2919</span><span id="line-2919"> annotations(BeanAnnotation.create(c).sort(true).build());</span> |
| <span class="source-line-no">2920</span><span id="line-2920"> return this;</span> |
| <span class="source-line-no">2921</span><span id="line-2921"> }</span> |
| <span class="source-line-no">2922</span><span id="line-2922"></span> |
| <span class="source-line-no">2923</span><span id="line-2923"> /**</span> |
| <span class="source-line-no">2924</span><span id="line-2924"> * Identifies a stop class for the annotated class.</span> |
| <span class="source-line-no">2925</span><span id="line-2925"> *</span> |
| <span class="source-line-no">2926</span><span id="line-2926"> * <p></span> |
| <span class="source-line-no">2927</span><span id="line-2927"> * Identical in purpose to the stop class specified by {@link Introspector#getBeanInfo(Class, Class)}.</span> |
| <span class="source-line-no">2928</span><span id="line-2928"> * Any properties in the stop class or in its base classes will be ignored during analysis.</span> |
| <span class="source-line-no">2929</span><span id="line-2929"> *</span> |
| <span class="source-line-no">2930</span><span id="line-2930"> * <p></span> |
| <span class="source-line-no">2931</span><span id="line-2931"> * For example, in the following class hierarchy, instances of <c>C3</c> will include property <c>p3</c>,</span> |
| <span class="source-line-no">2932</span><span id="line-2932"> * but not <c>p1</c> or <c>p2</c>.</span> |
| <span class="source-line-no">2933</span><span id="line-2933"> *</span> |
| <span class="source-line-no">2934</span><span id="line-2934"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2935</span><span id="line-2935"> * <p class='bjava'></span> |
| <span class="source-line-no">2936</span><span id="line-2936"> * <jk>public class</jk> C1 {</span> |
| <span class="source-line-no">2937</span><span id="line-2937"> * <jk>public int</jk> getP1();</span> |
| <span class="source-line-no">2938</span><span id="line-2938"> * }</span> |
| <span class="source-line-no">2939</span><span id="line-2939"> *</span> |
| <span class="source-line-no">2940</span><span id="line-2940"> * <jk>public class</jk> C2 <jk>extends</jk> C1 {</span> |
| <span class="source-line-no">2941</span><span id="line-2941"> * <jk>public int</jk> getP2();</span> |
| <span class="source-line-no">2942</span><span id="line-2942"> * }</span> |
| <span class="source-line-no">2943</span><span id="line-2943"> *</span> |
| <span class="source-line-no">2944</span><span id="line-2944"> * <jk>public class</jk> C3 <jk>extends</jk> C2 {</span> |
| <span class="source-line-no">2945</span><span id="line-2945"> * <jk>public int</jk> getP3();</span> |
| <span class="source-line-no">2946</span><span id="line-2946"> * }</span> |
| <span class="source-line-no">2947</span><span id="line-2947"> *</span> |
| <span class="source-line-no">2948</span><span id="line-2948"> * <jc>// Create a serializer specifies a stop class for C3.</jc></span> |
| <span class="source-line-no">2949</span><span id="line-2949"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">2950</span><span id="line-2950"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">2951</span><span id="line-2951"> * .stopClass(C3.<jk>class</jk>, C2.<jk>class</jk>)</span> |
| <span class="source-line-no">2952</span><span id="line-2952"> * .build();</span> |
| <span class="source-line-no">2953</span><span id="line-2953"> *</span> |
| <span class="source-line-no">2954</span><span id="line-2954"> * <jc>// Produces: {"p3":"..."}</jc></span> |
| <span class="source-line-no">2955</span><span id="line-2955"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> C3());</span> |
| <span class="source-line-no">2956</span><span id="line-2956"> * </p></span> |
| <span class="source-line-no">2957</span><span id="line-2957"> *</span> |
| <span class="source-line-no">2958</span><span id="line-2958"> * @param on The class on which the stop class is being applied.</span> |
| <span class="source-line-no">2959</span><span id="line-2959"> * @param value</span> |
| <span class="source-line-no">2960</span><span id="line-2960"> * The new value for this setting.</span> |
| <span class="source-line-no">2961</span><span id="line-2961"> * @return This object.</span> |
| <span class="source-line-no">2962</span><span id="line-2962"> */</span> |
| <span class="source-line-no">2963</span><span id="line-2963"> @FluentSetter</span> |
| <span class="source-line-no">2964</span><span id="line-2964"> public Builder stopClass(Class<?> on, Class<?> value) {</span> |
| <span class="source-line-no">2965</span><span id="line-2965"> return annotations(BeanAnnotation.create(on).stopClass(value).build());</span> |
| <span class="source-line-no">2966</span><span id="line-2966"> }</span> |
| <span class="source-line-no">2967</span><span id="line-2967"></span> |
| <span class="source-line-no">2968</span><span id="line-2968"> /**</span> |
| <span class="source-line-no">2969</span><span id="line-2969"> * Java object swaps.</span> |
| <span class="source-line-no">2970</span><span id="line-2970"> *</span> |
| <span class="source-line-no">2971</span><span id="line-2971"> * <p></span> |
| <span class="source-line-no">2972</span><span id="line-2972"> * Swaps are used to "swap out" non-serializable classes with serializable equivalents during serialization,</span> |
| <span class="source-line-no">2973</span><span id="line-2973"> * and "swap in" the non-serializable class during parsing.</span> |
| <span class="source-line-no">2974</span><span id="line-2974"> *</span> |
| <span class="source-line-no">2975</span><span id="line-2975"> * <p></span> |
| <span class="source-line-no">2976</span><span id="line-2976"> * An example of a swap would be a <c>Calendar</c> object that gets swapped out for an ISO8601 string.</span> |
| <span class="source-line-no">2977</span><span id="line-2977"> *</span> |
| <span class="source-line-no">2978</span><span id="line-2978"> * <p></span> |
| <span class="source-line-no">2979</span><span id="line-2979"> * Multiple swaps can be associated with a single class.</span> |
| <span class="source-line-no">2980</span><span id="line-2980"> * When multiple swaps are applicable to the same class, the media type pattern defined by</span> |
| <span class="source-line-no">2981</span><span id="line-2981"> * {@link ObjectSwap#forMediaTypes()} or {@link Swap#mediaTypes() @Swap(mediaTypes)} are used to come up with the best match.</span> |
| <span class="source-line-no">2982</span><span id="line-2982"> *</span> |
| <span class="source-line-no">2983</span><span id="line-2983"> * <p></span> |
| <span class="source-line-no">2984</span><span id="line-2984"> * Values can consist of any of the following types:</span> |
| <span class="source-line-no">2985</span><span id="line-2985"> * <ul></span> |
| <span class="source-line-no">2986</span><span id="line-2986"> * <li>Any subclass of {@link ObjectSwap}.</span> |
| <span class="source-line-no">2987</span><span id="line-2987"> * <li>Any instance of {@link ObjectSwap}.</span> |
| <span class="source-line-no">2988</span><span id="line-2988"> * <li>Any surrogate class. A shortcut for defining a {@link SurrogateSwap}.</span> |
| <span class="source-line-no">2989</span><span id="line-2989"> * <li>Any array or collection of the objects above.</span> |
| <span class="source-line-no">2990</span><span id="line-2990"> * </ul></span> |
| <span class="source-line-no">2991</span><span id="line-2991"> *</span> |
| <span class="source-line-no">2992</span><span id="line-2992"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">2993</span><span id="line-2993"> * <p class='bjava'></span> |
| <span class="source-line-no">2994</span><span id="line-2994"> * <jc>// Sample swap for converting Dates to ISO8601 strings.</jc></span> |
| <span class="source-line-no">2995</span><span id="line-2995"> * <jk>public class</jk> MyDateSwap <jk>extends</jk> StringSwap&lt;Date&gt; {</span> |
| <span class="source-line-no">2996</span><span id="line-2996"> * <jc>// ISO8601 formatter.</jc></span> |
| <span class="source-line-no">2997</span><span id="line-2997"> * <jk>private</jk> DateFormat <jf>format</jf> = <jk>new</jk> SimpleDateFormat(<js>"yyyy-MM-dd'T'HH:mm:ssZ"</js>);</span> |
| <span class="source-line-no">2998</span><span id="line-2998"> *</span> |
| <span class="source-line-no">2999</span><span id="line-2999"> * <ja>@Override</ja></span> |
| <span class="source-line-no">3000</span><span id="line-3000"> * <jk>public</jk> String swap(BeanSession <jv>session</jv>, Date <jv>date</jv>) {</span> |
| <span class="source-line-no">3001</span><span id="line-3001"> * <jk>return</jk> <jf>format</jf>.format(<jv>date</jv>);</span> |
| <span class="source-line-no">3002</span><span id="line-3002"> * }</span> |
| <span class="source-line-no">3003</span><span id="line-3003"> *</span> |
| <span class="source-line-no">3004</span><span id="line-3004"> * <ja>@Override</ja></span> |
| <span class="source-line-no">3005</span><span id="line-3005"> * <jk>public</jk> Date unswap(BeanSession <jv>session</jv>, String <jv>string</jv>, ClassMeta <jv>hint</jv>) <jk>throws</jk> Exception {</span> |
| <span class="source-line-no">3006</span><span id="line-3006"> * <jk>return</jk> <jf>format</jf>.parse(<jv>string</jv>);</span> |
| <span class="source-line-no">3007</span><span id="line-3007"> * }</span> |
| <span class="source-line-no">3008</span><span id="line-3008"> * }</span> |
| <span class="source-line-no">3009</span><span id="line-3009"> *</span> |
| <span class="source-line-no">3010</span><span id="line-3010"> * <jc>// Sample bean with a Date field.</jc></span> |
| <span class="source-line-no">3011</span><span id="line-3011"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">3012</span><span id="line-3012"> * <jk>public</jk> Date <jf>date</jf> = <jk>new</jk> Date(112, 2, 3, 4, 5, 6);</span> |
| <span class="source-line-no">3013</span><span id="line-3013"> * }</span> |
| <span class="source-line-no">3014</span><span id="line-3014"> *</span> |
| <span class="source-line-no">3015</span><span id="line-3015"> * <jc>// Create a serializer that uses our date swap.</jc></span> |
| <span class="source-line-no">3016</span><span id="line-3016"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">3017</span><span id="line-3017"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">3018</span><span id="line-3018"> * .swaps(MyDateSwap.<jk>class</jk>)</span> |
| <span class="source-line-no">3019</span><span id="line-3019"> * .build();</span> |
| <span class="source-line-no">3020</span><span id="line-3020"> *</span> |
| <span class="source-line-no">3021</span><span id="line-3021"> * <jc>// Produces: {"date":"2012-03-03T04:05:06-0500"}</jc></span> |
| <span class="source-line-no">3022</span><span id="line-3022"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">3023</span><span id="line-3023"> *</span> |
| <span class="source-line-no">3024</span><span id="line-3024"> * <jc>// Create a serializer that uses our date swap.</jc></span> |
| <span class="source-line-no">3025</span><span id="line-3025"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">3026</span><span id="line-3026"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">3027</span><span id="line-3027"> * .swaps(MyDateSwap.<jk>class</jk>)</span> |
| <span class="source-line-no">3028</span><span id="line-3028"> * .build();</span> |
| <span class="source-line-no">3029</span><span id="line-3029"> *</span> |
| <span class="source-line-no">3030</span><span id="line-3030"> * <jc>// Use our parser to parse a bean.</jc></span> |
| <span class="source-line-no">3031</span><span id="line-3031"> * MyBean <jv>bean</jv> = <jv>parser</jv>.parse(<jv>json</jv>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">3032</span><span id="line-3032"> * </p></span> |
| <span class="source-line-no">3033</span><span id="line-3033"> *</span> |
| <span class="source-line-no">3034</span><span id="line-3034"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">3035</span><span id="line-3035"> * <li class='note'>The {@link Swap @Swap} annotation can also be used on classes to identify swaps for the class.</span> |
| <span class="source-line-no">3036</span><span id="line-3036"> * <li class='note'>The {@link Swap @Swap} annotation can also be used on bean methods and fields to identify swaps for values of those bean properties.</span> |
| <span class="source-line-no">3037</span><span id="line-3037"> * </ul></span> |
| <span class="source-line-no">3038</span><span id="line-3038"> *</span> |
| <span class="source-line-no">3039</span><span id="line-3039"> * @param values</span> |
| <span class="source-line-no">3040</span><span id="line-3040"> * The values to add to this setting.</span> |
| <span class="source-line-no">3041</span><span id="line-3041"> * <br>Values can consist of any of the following types:</span> |
| <span class="source-line-no">3042</span><span id="line-3042"> * <ul></span> |
| <span class="source-line-no">3043</span><span id="line-3043"> * <li>Any subclass of {@link ObjectSwap}.</span> |
| <span class="source-line-no">3044</span><span id="line-3044"> * <li>Any surrogate class. A shortcut for defining a {@link SurrogateSwap}.</span> |
| <span class="source-line-no">3045</span><span id="line-3045"> * <li>Any array or collection of the objects above.</span> |
| <span class="source-line-no">3046</span><span id="line-3046"> * </ul></span> |
| <span class="source-line-no">3047</span><span id="line-3047"> * @return This object.</span> |
| <span class="source-line-no">3048</span><span id="line-3048"> */</span> |
| <span class="source-line-no">3049</span><span id="line-3049"> @FluentSetter</span> |
| <span class="source-line-no">3050</span><span id="line-3050"> public Builder swaps(Class<?>...values) {</span> |
| <span class="source-line-no">3051</span><span id="line-3051"> return swaps(alist(values));</span> |
| <span class="source-line-no">3052</span><span id="line-3052"> }</span> |
| <span class="source-line-no">3053</span><span id="line-3053"></span> |
| <span class="source-line-no">3054</span><span id="line-3054"> /**</span> |
| <span class="source-line-no">3055</span><span id="line-3055"> * Same as {@link #swaps(Class...)} but allows you to pass in a collection of classes.</span> |
| <span class="source-line-no">3056</span><span id="line-3056"> *</span> |
| <span class="source-line-no">3057</span><span id="line-3057"> * @param values</span> |
| <span class="source-line-no">3058</span><span id="line-3058"> * The values to add to this setting.</span> |
| <span class="source-line-no">3059</span><span id="line-3059"> * @return This object.</span> |
| <span class="source-line-no">3060</span><span id="line-3060"> * @see #swaps(Class...)</span> |
| <span class="source-line-no">3061</span><span id="line-3061"> */</span> |
| <span class="source-line-no">3062</span><span id="line-3062"> @FluentSetter</span> |
| <span class="source-line-no">3063</span><span id="line-3063"> public Builder swaps(Collection<Class<?>> values) {</span> |
| <span class="source-line-no">3064</span><span id="line-3064"> swaps().addAll(0, values);</span> |
| <span class="source-line-no">3065</span><span id="line-3065"> return this;</span> |
| <span class="source-line-no">3066</span><span id="line-3066"> }</span> |
| <span class="source-line-no">3067</span><span id="line-3067"></span> |
| <span class="source-line-no">3068</span><span id="line-3068"> /**</span> |
| <span class="source-line-no">3069</span><span id="line-3069"> * A shortcut for defining a {@link FunctionalSwap}.</span> |
| <span class="source-line-no">3070</span><span id="line-3070"> *</span> |
| <span class="source-line-no">3071</span><span id="line-3071"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">3072</span><span id="line-3072"> * <p class='bjava'></span> |
| <span class="source-line-no">3073</span><span id="line-3073"> * <jc>// Create a serializer that performs a custom format for DAte objects.</jc></span> |
| <span class="source-line-no">3074</span><span id="line-3074"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">3075</span><span id="line-3075"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">3076</span><span id="line-3076"> * .swap(Date.<jk>class</jk>, String.<jk>class</jk>, <jv>x</jv> -&gt; <jsm>format</jsm>(<jv>x</jv>))</span> |
| <span class="source-line-no">3077</span><span id="line-3077"> * .build();</span> |
| <span class="source-line-no">3078</span><span id="line-3078"> * </p></span> |
| <span class="source-line-no">3079</span><span id="line-3079"> *</span> |
| <span class="source-line-no">3080</span><span id="line-3080"> * @param <T> The object type being swapped out.</span> |
| <span class="source-line-no">3081</span><span id="line-3081"> * @param <S> The object type being swapped in.</span> |
| <span class="source-line-no">3082</span><span id="line-3082"> * @param normalClass The object type being swapped out.</span> |
| <span class="source-line-no">3083</span><span id="line-3083"> * @param swappedClass The object type being swapped in.</span> |
| <span class="source-line-no">3084</span><span id="line-3084"> * @param swapFunction The function to convert the object.</span> |
| <span class="source-line-no">3085</span><span id="line-3085"> * @return This object.</span> |
| <span class="source-line-no">3086</span><span id="line-3086"> */</span> |
| <span class="source-line-no">3087</span><span id="line-3087"> @FluentSetter</span> |
| <span class="source-line-no">3088</span><span id="line-3088"> public <T,S> Builder swap(Class<T> normalClass, Class<S> swappedClass, ThrowingFunction<T,S> swapFunction) {</span> |
| <span class="source-line-no">3089</span><span id="line-3089"> return swap(normalClass, swappedClass, swapFunction, null);</span> |
| <span class="source-line-no">3090</span><span id="line-3090"> }</span> |
| <span class="source-line-no">3091</span><span id="line-3091"></span> |
| <span class="source-line-no">3092</span><span id="line-3092"> /**</span> |
| <span class="source-line-no">3093</span><span id="line-3093"> * A shortcut for defining a {@link FunctionalSwap}.</span> |
| <span class="source-line-no">3094</span><span id="line-3094"> *</span> |
| <span class="source-line-no">3095</span><span id="line-3095"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">3096</span><span id="line-3096"> * <p class='bjava'></span> |
| <span class="source-line-no">3097</span><span id="line-3097"> * <jc>// Create a serializer that performs a custom format for Date objects.</jc></span> |
| <span class="source-line-no">3098</span><span id="line-3098"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">3099</span><span id="line-3099"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">3100</span><span id="line-3100"> * .swap(Date.<jk>class</jk>, String.<jk>class</jk>, <jv>x</jv> -&gt; <jsm>format</jsm>(<jv>x</jv>), <jv>x</jv> -&gt; <jsm>parse</jsm>(<jv>x</jv>))</span> |
| <span class="source-line-no">3101</span><span id="line-3101"> * .build();</span> |
| <span class="source-line-no">3102</span><span id="line-3102"> * </p></span> |
| <span class="source-line-no">3103</span><span id="line-3103"> *</span> |
| <span class="source-line-no">3104</span><span id="line-3104"> * @param <T> The object type being swapped out.</span> |
| <span class="source-line-no">3105</span><span id="line-3105"> * @param <S> The object type being swapped in.</span> |
| <span class="source-line-no">3106</span><span id="line-3106"> * @param normalClass The object type being swapped out.</span> |
| <span class="source-line-no">3107</span><span id="line-3107"> * @param swappedClass The object type being swapped in.</span> |
| <span class="source-line-no">3108</span><span id="line-3108"> * @param swapFunction The function to convert the object during serialization.</span> |
| <span class="source-line-no">3109</span><span id="line-3109"> * @param unswapFunction The function to convert the object during parsing.</span> |
| <span class="source-line-no">3110</span><span id="line-3110"> * @return This object.</span> |
| <span class="source-line-no">3111</span><span id="line-3111"> */</span> |
| <span class="source-line-no">3112</span><span id="line-3112"> @FluentSetter</span> |
| <span class="source-line-no">3113</span><span id="line-3113"> public <T,S> Builder swap(Class<T> normalClass, Class<S> swappedClass, ThrowingFunction<T,S> swapFunction, ThrowingFunction<S,T> unswapFunction) {</span> |
| <span class="source-line-no">3114</span><span id="line-3114"> swaps().add(0, new FunctionalSwap<>(normalClass, swappedClass, swapFunction, unswapFunction));</span> |
| <span class="source-line-no">3115</span><span id="line-3115"> return this;</span> |
| <span class="source-line-no">3116</span><span id="line-3116"> }</span> |
| <span class="source-line-no">3117</span><span id="line-3117"></span> |
| <span class="source-line-no">3118</span><span id="line-3118"> /**</span> |
| <span class="source-line-no">3119</span><span id="line-3119"> * Returns the bean swaps list.</span> |
| <span class="source-line-no">3120</span><span id="line-3120"> *</span> |
| <span class="source-line-no">3121</span><span id="line-3121"> * <p></span> |
| <span class="source-line-no">3122</span><span id="line-3122"> * Gives access to the inner list if you need to make more than simple additions via {@link #swaps(Class...)}.</span> |
| <span class="source-line-no">3123</span><span id="line-3123"> *</span> |
| <span class="source-line-no">3124</span><span id="line-3124"> * @return The bean swaps list.</span> |
| <span class="source-line-no">3125</span><span id="line-3125"> * @see #swaps(Class...)</span> |
| <span class="source-line-no">3126</span><span id="line-3126"> */</span> |
| <span class="source-line-no">3127</span><span id="line-3127"> public List<Object> swaps() {</span> |
| <span class="source-line-no">3128</span><span id="line-3128"> if (swaps == null)</span> |
| <span class="source-line-no">3129</span><span id="line-3129"> swaps = list();</span> |
| <span class="source-line-no">3130</span><span id="line-3130"> return swaps;</span> |
| <span class="source-line-no">3131</span><span id="line-3131"> }</span> |
| <span class="source-line-no">3132</span><span id="line-3132"></span> |
| <span class="source-line-no">3133</span><span id="line-3133"> /**</span> |
| <span class="source-line-no">3134</span><span id="line-3134"> * <i><l>Context</l> configuration property:&emsp;</i> TimeZone.</span> |
| <span class="source-line-no">3135</span><span id="line-3135"> *</span> |
| <span class="source-line-no">3136</span><span id="line-3136"> * <p></span> |
| <span class="source-line-no">3137</span><span id="line-3137"> * Specifies the default time zone for serializer and parser sessions when not specified via {@link BeanSession.Builder#timeZone(TimeZone)}.</span> |
| <span class="source-line-no">3138</span><span id="line-3138"> * Typically used for POJO swaps that need to deal with timezones such as swaps that convert <l>Date</l> and <l>Calendar</l></span> |
| <span class="source-line-no">3139</span><span id="line-3139"> * objects to strings by accessing it via the session passed into the {@link ObjectSwap#swap(BeanSession, Object)} and</span> |
| <span class="source-line-no">3140</span><span id="line-3140"> * {@link ObjectSwap#unswap(BeanSession, Object, ClassMeta, String)} methods.</span> |
| <span class="source-line-no">3141</span><span id="line-3141"> *</span> |
| <span class="source-line-no">3142</span><span id="line-3142"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">3143</span><span id="line-3143"> * <p class='bjava'></span> |
| <span class="source-line-no">3144</span><span id="line-3144"> * <jc>// Define a POJO swap that skips serializing beans if the time zone is GMT.</jc></span> |
| <span class="source-line-no">3145</span><span id="line-3145"> * <jk>public class</jk> MyBeanSwap <jk>extends</jk> StringSwap&lt;MyBean&gt; {</span> |
| <span class="source-line-no">3146</span><span id="line-3146"> * <ja>@Override</ja></span> |
| <span class="source-line-no">3147</span><span id="line-3147"> * <jk>public</jk> String swap(BeanSession <jv>session</jv>, MyBean <jv>bean</jv>) <jk>throws</jk> Exception {</span> |
| <span class="source-line-no">3148</span><span id="line-3148"> * <jk>if</jk> (<jv>session</jv>.getTimeZone().equals(TimeZone.<jsf>GMT</jsf>))</span> |
| <span class="source-line-no">3149</span><span id="line-3149"> * <jk>return null</jk>;</span> |
| <span class="source-line-no">3150</span><span id="line-3150"> * <jk>return</jk> <jv>bean</jv>.toString();</span> |
| <span class="source-line-no">3151</span><span id="line-3151"> * }</span> |
| <span class="source-line-no">3152</span><span id="line-3152"> * }</span> |
| <span class="source-line-no">3153</span><span id="line-3153"> *</span> |
| <span class="source-line-no">3154</span><span id="line-3154"> * <jc>// Create a serializer that uses GMT if the timezone is not specified in the session args.</jc></span> |
| <span class="source-line-no">3155</span><span id="line-3155"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">3156</span><span id="line-3156"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">3157</span><span id="line-3157"> * .timeZone(TimeZone.<jsf>GMT</jsf>)</span> |
| <span class="source-line-no">3158</span><span id="line-3158"> * .build();</span> |
| <span class="source-line-no">3159</span><span id="line-3159"> * </p></span> |
| <span class="source-line-no">3160</span><span id="line-3160"> *</span> |
| <span class="source-line-no">3161</span><span id="line-3161"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">3162</span><span id="line-3162"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#timeZone()}</span> |
| <span class="source-line-no">3163</span><span id="line-3163"> * <li class='jm'>{@link org.apache.juneau.BeanSession.Builder#timeZone(TimeZone)}</span> |
| <span class="source-line-no">3164</span><span id="line-3164"> * </ul></span> |
| <span class="source-line-no">3165</span><span id="line-3165"> *</span> |
| <span class="source-line-no">3166</span><span id="line-3166"> * @param value The new value for this property.</span> |
| <span class="source-line-no">3167</span><span id="line-3167"> * @return This object.</span> |
| <span class="source-line-no">3168</span><span id="line-3168"> */</span> |
| <span class="source-line-no">3169</span><span id="line-3169"> @FluentSetter</span> |
| <span class="source-line-no">3170</span><span id="line-3170"> public Builder timeZone(TimeZone value) {</span> |
| <span class="source-line-no">3171</span><span id="line-3171"> timeZone = value;</span> |
| <span class="source-line-no">3172</span><span id="line-3172"> return this;</span> |
| <span class="source-line-no">3173</span><span id="line-3173"> }</span> |
| <span class="source-line-no">3174</span><span id="line-3174"></span> |
| <span class="source-line-no">3175</span><span id="line-3175"> /**</span> |
| <span class="source-line-no">3176</span><span id="line-3176"> * An identifying name for this class.</span> |
| <span class="source-line-no">3177</span><span id="line-3177"> *</span> |
| <span class="source-line-no">3178</span><span id="line-3178"> * <p></span> |
| <span class="source-line-no">3179</span><span id="line-3179"> * The name is used to identify the class type during parsing when it cannot be inferred through reflection.</span> |
| <span class="source-line-no">3180</span><span id="line-3180"> * For example, if a bean property is of type <c>Object</c>, then the serializer will add the name to the</span> |
| <span class="source-line-no">3181</span><span id="line-3181"> * output so that the class can be determined during parsing.</span> |
| <span class="source-line-no">3182</span><span id="line-3182"> *</span> |
| <span class="source-line-no">3183</span><span id="line-3183"> * <p></span> |
| <span class="source-line-no">3184</span><span id="line-3184"> * It is also used to specify element names in XML.</span> |
| <span class="source-line-no">3185</span><span id="line-3185"> *</span> |
| <span class="source-line-no">3186</span><span id="line-3186"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">3187</span><span id="line-3187"> * <p class='bjava'></span> |
| <span class="source-line-no">3188</span><span id="line-3188"> * <jc>// Use _type='mybean' to identify this bean.</jc></span> |
| <span class="source-line-no">3189</span><span id="line-3189"> * <jk>public class</jk> MyBean {...}</span> |
| <span class="source-line-no">3190</span><span id="line-3190"> *</span> |
| <span class="source-line-no">3191</span><span id="line-3191"> * <jc>// Create a serializer and specify the type name..</jc></span> |
| <span class="source-line-no">3192</span><span id="line-3192"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">3193</span><span id="line-3193"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">3194</span><span id="line-3194"> * .typeName(MyBean.<jk>class</jk>, <js>"mybean"</js>)</span> |
| <span class="source-line-no">3195</span><span id="line-3195"> * .build();</span> |
| <span class="source-line-no">3196</span><span id="line-3196"> *</span> |
| <span class="source-line-no">3197</span><span id="line-3197"> * <jc>// Produces: {"_type":"mybean",...}</jc></span> |
| <span class="source-line-no">3198</span><span id="line-3198"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">3199</span><span id="line-3199"> * </p></span> |
| <span class="source-line-no">3200</span><span id="line-3200"> *</span> |
| <span class="source-line-no">3201</span><span id="line-3201"> * <h5 class='section'>Notes:</h5><ul></span> |
| <span class="source-line-no">3202</span><span id="line-3202"> * <li class='note'>Equivalent to the {@link Bean#typeName() Bean(typeName)} annotation.</span> |
| <span class="source-line-no">3203</span><span id="line-3203"> * </ul></span> |
| <span class="source-line-no">3204</span><span id="line-3204"> *</span> |
| <span class="source-line-no">3205</span><span id="line-3205"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">3206</span><span id="line-3206"> * <li class='jc'>{@link Bean#typeName() Bean(typeName)}</span> |
| <span class="source-line-no">3207</span><span id="line-3207"> * <li class='jm'>{@link #beanDictionary(Class...)}</span> |
| <span class="source-line-no">3208</span><span id="line-3208"> * </ul></span> |
| <span class="source-line-no">3209</span><span id="line-3209"> *</span> |
| <span class="source-line-no">3210</span><span id="line-3210"> * @param on</span> |
| <span class="source-line-no">3211</span><span id="line-3211"> * The class the type name is being defined on.</span> |
| <span class="source-line-no">3212</span><span id="line-3212"> * @param value</span> |
| <span class="source-line-no">3213</span><span id="line-3213"> * The new value for this setting.</span> |
| <span class="source-line-no">3214</span><span id="line-3214"> * @return This object.</span> |
| <span class="source-line-no">3215</span><span id="line-3215"> */</span> |
| <span class="source-line-no">3216</span><span id="line-3216"> @FluentSetter</span> |
| <span class="source-line-no">3217</span><span id="line-3217"> public Builder typeName(Class<?> on, String value) {</span> |
| <span class="source-line-no">3218</span><span id="line-3218"> return annotations(BeanAnnotation.create(on).typeName(value).build());</span> |
| <span class="source-line-no">3219</span><span id="line-3219"> }</span> |
| <span class="source-line-no">3220</span><span id="line-3220"></span> |
| <span class="source-line-no">3221</span><span id="line-3221"> /**</span> |
| <span class="source-line-no">3222</span><span id="line-3222"> * Bean type property name.</span> |
| <span class="source-line-no">3223</span><span id="line-3223"> *</span> |
| <span class="source-line-no">3224</span><span id="line-3224"> * <p></span> |
| <span class="source-line-no">3225</span><span id="line-3225"> * This specifies the name of the bean property used to store the dictionary name of a bean type so that the</span> |
| <span class="source-line-no">3226</span><span id="line-3226"> * parser knows the data type to reconstruct.</span> |
| <span class="source-line-no">3227</span><span id="line-3227"> *</span> |
| <span class="source-line-no">3228</span><span id="line-3228"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">3229</span><span id="line-3229"> * <p class='bjava'></span> |
| <span class="source-line-no">3230</span><span id="line-3230"> * <jc>// POJOs with @Bean(name) annotations.</jc></span> |
| <span class="source-line-no">3231</span><span id="line-3231"> * <ja>@Bean</ja>(typeName=<js>"foo"</js>)</span> |
| <span class="source-line-no">3232</span><span id="line-3232"> * <jk>public class</jk> Foo {...}</span> |
| <span class="source-line-no">3233</span><span id="line-3233"> * <ja>@Bean</ja>(typeName=<js>"bar"</js>)</span> |
| <span class="source-line-no">3234</span><span id="line-3234"> * <jk>public class</jk> Bar {...}</span> |
| <span class="source-line-no">3235</span><span id="line-3235"> *</span> |
| <span class="source-line-no">3236</span><span id="line-3236"> * <jc>// Create a serializer that uses 't' instead of '_type' for dictionary names.</jc></span> |
| <span class="source-line-no">3237</span><span id="line-3237"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">3238</span><span id="line-3238"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">3239</span><span id="line-3239"> * .typePropertyName(<js>"t"</js>)</span> |
| <span class="source-line-no">3240</span><span id="line-3240"> * .dictionary(Foo.<jk>class</jk>, Bar.<jk>class</jk>)</span> |
| <span class="source-line-no">3241</span><span id="line-3241"> * .build();</span> |
| <span class="source-line-no">3242</span><span id="line-3242"> *</span> |
| <span class="source-line-no">3243</span><span id="line-3243"> * <jc>// Create a serializer that uses 't' instead of '_type' for dictionary names.</jc></span> |
| <span class="source-line-no">3244</span><span id="line-3244"> * ReaderParser <jv>parser</jv> = JsonParser</span> |
| <span class="source-line-no">3245</span><span id="line-3245"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">3246</span><span id="line-3246"> * .typePropertyName(<js>"t"</js>)</span> |
| <span class="source-line-no">3247</span><span id="line-3247"> * .dictionary(Foo.<jk>class</jk>, Bar.<jk>class</jk>)</span> |
| <span class="source-line-no">3248</span><span id="line-3248"> * .build();</span> |
| <span class="source-line-no">3249</span><span id="line-3249"> *</span> |
| <span class="source-line-no">3250</span><span id="line-3250"> * <jc>// A bean with a field with an indeterminate type.</jc></span> |
| <span class="source-line-no">3251</span><span id="line-3251"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">3252</span><span id="line-3252"> * <jk>public</jk> Object <jf>mySimpleField</jf>;</span> |
| <span class="source-line-no">3253</span><span id="line-3253"> * }</span> |
| <span class="source-line-no">3254</span><span id="line-3254"> *</span> |
| <span class="source-line-no">3255</span><span id="line-3255"> * <jc>// Produces "{mySimpleField:{t:'foo',...}}".</jc></span> |
| <span class="source-line-no">3256</span><span id="line-3256"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">3257</span><span id="line-3257"> *</span> |
| <span class="source-line-no">3258</span><span id="line-3258"> * <jc>// Parse bean.</jc></span> |
| <span class="source-line-no">3259</span><span id="line-3259"> * MyBean <jv>bean</jv> = <jv>parser</jv>.parse(<jv>json</jv>, MyBean.<jk>class</jk>);</span> |
| <span class="source-line-no">3260</span><span id="line-3260"> * </p></span> |
| <span class="source-line-no">3261</span><span id="line-3261"> *</span> |
| <span class="source-line-no">3262</span><span id="line-3262"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">3263</span><span id="line-3263"> * <li class='ja'>{@link org.apache.juneau.annotation.Bean#typePropertyName()}</span> |
| <span class="source-line-no">3264</span><span id="line-3264"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#typePropertyName()}</span> |
| <span class="source-line-no">3265</span><span id="line-3265"> * </ul></span> |
| <span class="source-line-no">3266</span><span id="line-3266"> *</span> |
| <span class="source-line-no">3267</span><span id="line-3267"> * @param value</span> |
| <span class="source-line-no">3268</span><span id="line-3268"> * The new value for this setting.</span> |
| <span class="source-line-no">3269</span><span id="line-3269"> * <br>The default is <js>"_type"</js>.</span> |
| <span class="source-line-no">3270</span><span id="line-3270"> * @return This object.</span> |
| <span class="source-line-no">3271</span><span id="line-3271"> */</span> |
| <span class="source-line-no">3272</span><span id="line-3272"> @FluentSetter</span> |
| <span class="source-line-no">3273</span><span id="line-3273"> public Builder typePropertyName(String value) {</span> |
| <span class="source-line-no">3274</span><span id="line-3274"> typePropertyName = value;</span> |
| <span class="source-line-no">3275</span><span id="line-3275"> return this;</span> |
| <span class="source-line-no">3276</span><span id="line-3276"> }</span> |
| <span class="source-line-no">3277</span><span id="line-3277"></span> |
| <span class="source-line-no">3278</span><span id="line-3278"> /**</span> |
| <span class="source-line-no">3279</span><span id="line-3279"> * Bean type property name.</span> |
| <span class="source-line-no">3280</span><span id="line-3280"> *</span> |
| <span class="source-line-no">3281</span><span id="line-3281"> * <p></span> |
| <span class="source-line-no">3282</span><span id="line-3282"> * Same as {@link #typePropertyName(String)} except targets a specific bean class instead of globally.</span> |
| <span class="source-line-no">3283</span><span id="line-3283"> *</span> |
| <span class="source-line-no">3284</span><span id="line-3284"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">3285</span><span id="line-3285"> * <p class='bjava'></span> |
| <span class="source-line-no">3286</span><span id="line-3286"> * <jc>// POJOs with @Bean(name) annotations.</jc></span> |
| <span class="source-line-no">3287</span><span id="line-3287"> * <ja>@Bean</ja>(typeName=<js>"foo"</js>)</span> |
| <span class="source-line-no">3288</span><span id="line-3288"> * <jk>public class</jk> Foo {...}</span> |
| <span class="source-line-no">3289</span><span id="line-3289"> * <ja>@Bean</ja>(typeName=<js>"bar"</js>)</span> |
| <span class="source-line-no">3290</span><span id="line-3290"> * <jk>public class</jk> Bar {...}</span> |
| <span class="source-line-no">3291</span><span id="line-3291"> *</span> |
| <span class="source-line-no">3292</span><span id="line-3292"> * <jc>// A bean with a field with an indeterminate type.</jc></span> |
| <span class="source-line-no">3293</span><span id="line-3293"> * <jk>public class</jk> MyBean {</span> |
| <span class="source-line-no">3294</span><span id="line-3294"> * <jk>public</jk> Object <jf>mySimpleField</jf>;</span> |
| <span class="source-line-no">3295</span><span id="line-3295"> * }</span> |
| <span class="source-line-no">3296</span><span id="line-3296"> *</span> |
| <span class="source-line-no">3297</span><span id="line-3297"> * <jc>// Create a serializer that uses 't' instead of '_type' for dictionary names.</jc></span> |
| <span class="source-line-no">3298</span><span id="line-3298"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">3299</span><span id="line-3299"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">3300</span><span id="line-3300"> * .typePropertyName(MyBean.<jk>class</jk>, <js>"t"</js>)</span> |
| <span class="source-line-no">3301</span><span id="line-3301"> * .dictionary(Foo.<jk>class</jk>, Bar.<jk>class</jk>)</span> |
| <span class="source-line-no">3302</span><span id="line-3302"> * .build();</span> |
| <span class="source-line-no">3303</span><span id="line-3303"> *</span> |
| <span class="source-line-no">3304</span><span id="line-3304"> * <jc>// Produces "{mySimpleField:{t:'foo',...}}".</jc></span> |
| <span class="source-line-no">3305</span><span id="line-3305"> * String <jv>json</jv> = <jv>serializer</jv>.serialize(<jk>new</jk> MyBean());</span> |
| <span class="source-line-no">3306</span><span id="line-3306"> * </p></span> |
| <span class="source-line-no">3307</span><span id="line-3307"> *</span> |
| <span class="source-line-no">3308</span><span id="line-3308"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">3309</span><span id="line-3309"> * <li class='ja'>{@link Bean#typePropertyName() Bean(typePropertyName)}</span> |
| <span class="source-line-no">3310</span><span id="line-3310"> * </ul></span> |
| <span class="source-line-no">3311</span><span id="line-3311"> *</span> |
| <span class="source-line-no">3312</span><span id="line-3312"> * @param on The class the type property name applies to.</span> |
| <span class="source-line-no">3313</span><span id="line-3313"> * @param value</span> |
| <span class="source-line-no">3314</span><span id="line-3314"> * The new value for this setting.</span> |
| <span class="source-line-no">3315</span><span id="line-3315"> * <br>The default is <js>"_type"</js>.</span> |
| <span class="source-line-no">3316</span><span id="line-3316"> * @return This object.</span> |
| <span class="source-line-no">3317</span><span id="line-3317"> */</span> |
| <span class="source-line-no">3318</span><span id="line-3318"> @FluentSetter</span> |
| <span class="source-line-no">3319</span><span id="line-3319"> public Builder typePropertyName(Class<?> on, String value) {</span> |
| <span class="source-line-no">3320</span><span id="line-3320"> return annotations(BeanAnnotation.create(on).typePropertyName(value).build());</span> |
| <span class="source-line-no">3321</span><span id="line-3321"> }</span> |
| <span class="source-line-no">3322</span><span id="line-3322"></span> |
| <span class="source-line-no">3323</span><span id="line-3323"> /**</span> |
| <span class="source-line-no">3324</span><span id="line-3324"> * Use enum names.</span> |
| <span class="source-line-no">3325</span><span id="line-3325"> *</span> |
| <span class="source-line-no">3326</span><span id="line-3326"> * <p></span> |
| <span class="source-line-no">3327</span><span id="line-3327"> * When enabled, enums are always serialized by name, not using {@link Object#toString()}.</span> |
| <span class="source-line-no">3328</span><span id="line-3328"> *</span> |
| <span class="source-line-no">3329</span><span id="line-3329"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">3330</span><span id="line-3330"> * <p class='bjava'></span> |
| <span class="source-line-no">3331</span><span id="line-3331"> * <jc>// Create a serializer with debug enabled.</jc></span> |
| <span class="source-line-no">3332</span><span id="line-3332"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">3333</span><span id="line-3333"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">3334</span><span id="line-3334"> * .useEnumNames()</span> |
| <span class="source-line-no">3335</span><span id="line-3335"> * .build();</span> |
| <span class="source-line-no">3336</span><span id="line-3336"> *</span> |
| <span class="source-line-no">3337</span><span id="line-3337"> * <jc>// Enum with overridden toString().</jc></span> |
| <span class="source-line-no">3338</span><span id="line-3338"> * <jc>// Will be serialized as ONE/TWO/THREE even though there's a toString() method.</jc></span> |
| <span class="source-line-no">3339</span><span id="line-3339"> * <jk>public enum</jk> Option {</span> |
| <span class="source-line-no">3340</span><span id="line-3340"> * <jsf>ONE</jsf>(1),</span> |
| <span class="source-line-no">3341</span><span id="line-3341"> * <jsf>TWO</jsf>(2),</span> |
| <span class="source-line-no">3342</span><span id="line-3342"> * <jsf>THREE</jsf>(3);</span> |
| <span class="source-line-no">3343</span><span id="line-3343"> *</span> |
| <span class="source-line-no">3344</span><span id="line-3344"> * <jk>private int</jk> <jf>value</jf>;</span> |
| <span class="source-line-no">3345</span><span id="line-3345"> *</span> |
| <span class="source-line-no">3346</span><span id="line-3346"> * Option(<jk>int</jk> <jv>value</jv>) {</span> |
| <span class="source-line-no">3347</span><span id="line-3347"> * <jk>this</jk>.<jf>value</jf> = <jv>value</jv>;</span> |
| <span class="source-line-no">3348</span><span id="line-3348"> * }</span> |
| <span class="source-line-no">3349</span><span id="line-3349"> *</span> |
| <span class="source-line-no">3350</span><span id="line-3350"> * <ja>@Override</ja></span> |
| <span class="source-line-no">3351</span><span id="line-3351"> * <jk>public</jk> String toString() {</span> |
| <span class="source-line-no">3352</span><span id="line-3352"> * <jk>return</jk> String.<jsm>valueOf</jsm>(<jf>value</jf>);</span> |
| <span class="source-line-no">3353</span><span id="line-3353"> * }</span> |
| <span class="source-line-no">3354</span><span id="line-3354"> * }</span> |
| <span class="source-line-no">3355</span><span id="line-3355"> * </p></span> |
| <span class="source-line-no">3356</span><span id="line-3356"> *</span> |
| <span class="source-line-no">3357</span><span id="line-3357"> * @return This object.</span> |
| <span class="source-line-no">3358</span><span id="line-3358"> */</span> |
| <span class="source-line-no">3359</span><span id="line-3359"> @FluentSetter</span> |
| <span class="source-line-no">3360</span><span id="line-3360"> public Builder useEnumNames() {</span> |
| <span class="source-line-no">3361</span><span id="line-3361"> return useEnumNames(true);</span> |
| <span class="source-line-no">3362</span><span id="line-3362"> }</span> |
| <span class="source-line-no">3363</span><span id="line-3363"></span> |
| <span class="source-line-no">3364</span><span id="line-3364"> /**</span> |
| <span class="source-line-no">3365</span><span id="line-3365"> * Same as {@link #useEnumNames()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">3366</span><span id="line-3366"> *</span> |
| <span class="source-line-no">3367</span><span id="line-3367"> * @param value The value for this setting.</span> |
| <span class="source-line-no">3368</span><span id="line-3368"> * @return This object.</span> |
| <span class="source-line-no">3369</span><span id="line-3369"> */</span> |
| <span class="source-line-no">3370</span><span id="line-3370"> @FluentSetter</span> |
| <span class="source-line-no">3371</span><span id="line-3371"> public Builder useEnumNames(boolean value) {</span> |
| <span class="source-line-no">3372</span><span id="line-3372"> useEnumNames = value;</span> |
| <span class="source-line-no">3373</span><span id="line-3373"> return this;</span> |
| <span class="source-line-no">3374</span><span id="line-3374"> }</span> |
| <span class="source-line-no">3375</span><span id="line-3375"></span> |
| <span class="source-line-no">3376</span><span id="line-3376"> /**</span> |
| <span class="source-line-no">3377</span><span id="line-3377"> * Don't use interface proxies.</span> |
| <span class="source-line-no">3378</span><span id="line-3378"> *</span> |
| <span class="source-line-no">3379</span><span id="line-3379"> * <p></span> |
| <span class="source-line-no">3380</span><span id="line-3380"> * When enabled, interfaces will be instantiated as proxy classes through the use of an</span> |
| <span class="source-line-no">3381</span><span id="line-3381"> * {@link InvocationHandler} if there is no other way of instantiating them.</span> |
| <span class="source-line-no">3382</span><span id="line-3382"> * Otherwise, throws a {@link BeanRuntimeException}.</span> |
| <span class="source-line-no">3383</span><span id="line-3383"> *</span> |
| <span class="source-line-no">3384</span><span id="line-3384"> * <h5 class='section'>See Also:</h5><ul></span> |
| <span class="source-line-no">3385</span><span id="line-3385"> * <li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#disableInterfaceProxies()}</span> |
| <span class="source-line-no">3386</span><span id="line-3386"> * </ul></span> |
| <span class="source-line-no">3387</span><span id="line-3387"> *</span> |
| <span class="source-line-no">3388</span><span id="line-3388"> * @return This object.</span> |
| <span class="source-line-no">3389</span><span id="line-3389"> */</span> |
| <span class="source-line-no">3390</span><span id="line-3390"> @FluentSetter</span> |
| <span class="source-line-no">3391</span><span id="line-3391"> public Builder disableInterfaceProxies() {</span> |
| <span class="source-line-no">3392</span><span id="line-3392"> return disableInterfaceProxies(true);</span> |
| <span class="source-line-no">3393</span><span id="line-3393"> }</span> |
| <span class="source-line-no">3394</span><span id="line-3394"></span> |
| <span class="source-line-no">3395</span><span id="line-3395"> /**</span> |
| <span class="source-line-no">3396</span><span id="line-3396"> * Same as {@link #disableInterfaceProxies()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">3397</span><span id="line-3397"> *</span> |
| <span class="source-line-no">3398</span><span id="line-3398"> * @param value The value for this setting.</span> |
| <span class="source-line-no">3399</span><span id="line-3399"> * @return This object.</span> |
| <span class="source-line-no">3400</span><span id="line-3400"> */</span> |
| <span class="source-line-no">3401</span><span id="line-3401"> @FluentSetter</span> |
| <span class="source-line-no">3402</span><span id="line-3402"> public Builder disableInterfaceProxies(boolean value) {</span> |
| <span class="source-line-no">3403</span><span id="line-3403"> disableInterfaceProxies = value;</span> |
| <span class="source-line-no">3404</span><span id="line-3404"> return this;</span> |
| <span class="source-line-no">3405</span><span id="line-3405"> }</span> |
| <span class="source-line-no">3406</span><span id="line-3406"></span> |
| <span class="source-line-no">3407</span><span id="line-3407"> /**</span> |
| <span class="source-line-no">3408</span><span id="line-3408"> * Use Java Introspector.</span> |
| <span class="source-line-no">3409</span><span id="line-3409"> *</span> |
| <span class="source-line-no">3410</span><span id="line-3410"> * <p></span> |
| <span class="source-line-no">3411</span><span id="line-3411"> * Using the built-in Java bean introspector will not pick up fields or non-standard getters/setters.</span> |
| <span class="source-line-no">3412</span><span id="line-3412"> * <br>Most {@link Bean @Bean} annotations will be ignored.</span> |
| <span class="source-line-no">3413</span><span id="line-3413"> *</span> |
| <span class="source-line-no">3414</span><span id="line-3414"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">3415</span><span id="line-3415"> * <p class='bjava'></span> |
| <span class="source-line-no">3416</span><span id="line-3416"> * <jc>// Create a serializer that only uses the built-in java bean introspector for finding properties.</jc></span> |
| <span class="source-line-no">3417</span><span id="line-3417"> * WriterSerializer <jv>serializer</jv> = JsonSerializer</span> |
| <span class="source-line-no">3418</span><span id="line-3418"> * .<jsm>create</jsm>()</span> |
| <span class="source-line-no">3419</span><span id="line-3419"> * .useJavaBeanIntrospector()</span> |
| <span class="source-line-no">3420</span><span id="line-3420"> * .build();</span> |
| <span class="source-line-no">3421</span><span id="line-3421"> * </p></span> |
| <span class="source-line-no">3422</span><span id="line-3422"> *</span> |
| <span class="source-line-no">3423</span><span id="line-3423"> * @return This object.</span> |
| <span class="source-line-no">3424</span><span id="line-3424"> */</span> |
| <span class="source-line-no">3425</span><span id="line-3425"> @FluentSetter</span> |
| <span class="source-line-no">3426</span><span id="line-3426"> public Builder useJavaBeanIntrospector() {</span> |
| <span class="source-line-no">3427</span><span id="line-3427"> return useJavaBeanIntrospector(true);</span> |
| <span class="source-line-no">3428</span><span id="line-3428"> }</span> |
| <span class="source-line-no">3429</span><span id="line-3429"></span> |
| <span class="source-line-no">3430</span><span id="line-3430"> /**</span> |
| <span class="source-line-no">3431</span><span id="line-3431"> * Same as {@link #useJavaBeanIntrospector()} but allows you to explicitly specify the value.</span> |
| <span class="source-line-no">3432</span><span id="line-3432"> *</span> |
| <span class="source-line-no">3433</span><span id="line-3433"> * @param value The value for this setting.</span> |
| <span class="source-line-no">3434</span><span id="line-3434"> * @return This object.</span> |
| <span class="source-line-no">3435</span><span id="line-3435"> */</span> |
| <span class="source-line-no">3436</span><span id="line-3436"> @FluentSetter</span> |
| <span class="source-line-no">3437</span><span id="line-3437"> public Builder useJavaBeanIntrospector(boolean value) {</span> |
| <span class="source-line-no">3438</span><span id="line-3438"> useJavaBeanIntrospector = value;</span> |
| <span class="source-line-no">3439</span><span id="line-3439"> return this;</span> |
| <span class="source-line-no">3440</span><span id="line-3440"> }</span> |
| <span class="source-line-no">3441</span><span id="line-3441"></span> |
| <span class="source-line-no">3442</span><span id="line-3442"> // <FluentSetters></span> |
| <span class="source-line-no">3443</span><span id="line-3443"></span> |
| <span class="source-line-no">3444</span><span id="line-3444"> @Override /* GENERATED - org.apache.juneau.Context.Builder */</span> |
| <span class="source-line-no">3445</span><span id="line-3445"> public Builder annotations(Annotation...values) {</span> |
| <span class="source-line-no">3446</span><span id="line-3446"> super.annotations(values);</span> |
| <span class="source-line-no">3447</span><span id="line-3447"> return this;</span> |
| <span class="source-line-no">3448</span><span id="line-3448"> }</span> |
| <span class="source-line-no">3449</span><span id="line-3449"></span> |
| <span class="source-line-no">3450</span><span id="line-3450"> @Override /* GENERATED - org.apache.juneau.Context.Builder */</span> |
| <span class="source-line-no">3451</span><span id="line-3451"> public Builder apply(AnnotationWorkList work) {</span> |
| <span class="source-line-no">3452</span><span id="line-3452"> super.apply(work);</span> |
| <span class="source-line-no">3453</span><span id="line-3453"> return this;</span> |
| <span class="source-line-no">3454</span><span id="line-3454"> }</span> |
| <span class="source-line-no">3455</span><span id="line-3455"></span> |
| <span class="source-line-no">3456</span><span id="line-3456"> @Override /* GENERATED - org.apache.juneau.Context.Builder */</span> |
| <span class="source-line-no">3457</span><span id="line-3457"> public Builder applyAnnotations(java.lang.Class<?>...fromClasses) {</span> |
| <span class="source-line-no">3458</span><span id="line-3458"> super.applyAnnotations(fromClasses);</span> |
| <span class="source-line-no">3459</span><span id="line-3459"> return this;</span> |
| <span class="source-line-no">3460</span><span id="line-3460"> }</span> |
| <span class="source-line-no">3461</span><span id="line-3461"></span> |
| <span class="source-line-no">3462</span><span id="line-3462"> @Override /* GENERATED - org.apache.juneau.Context.Builder */</span> |
| <span class="source-line-no">3463</span><span id="line-3463"> public Builder applyAnnotations(Method...fromMethods) {</span> |
| <span class="source-line-no">3464</span><span id="line-3464"> super.applyAnnotations(fromMethods);</span> |
| <span class="source-line-no">3465</span><span id="line-3465"> return this;</span> |
| <span class="source-line-no">3466</span><span id="line-3466"> }</span> |
| <span class="source-line-no">3467</span><span id="line-3467"></span> |
| <span class="source-line-no">3468</span><span id="line-3468"> @Override /* GENERATED - org.apache.juneau.Context.Builder */</span> |
| <span class="source-line-no">3469</span><span id="line-3469"> public Builder cache(Cache<HashKey,? extends org.apache.juneau.Context> value) {</span> |
| <span class="source-line-no">3470</span><span id="line-3470"> super.cache(value);</span> |
| <span class="source-line-no">3471</span><span id="line-3471"> return this;</span> |
| <span class="source-line-no">3472</span><span id="line-3472"> }</span> |
| <span class="source-line-no">3473</span><span id="line-3473"></span> |
| <span class="source-line-no">3474</span><span id="line-3474"> @Override /* GENERATED - org.apache.juneau.Context.Builder */</span> |
| <span class="source-line-no">3475</span><span id="line-3475"> public Builder debug() {</span> |
| <span class="source-line-no">3476</span><span id="line-3476"> super.debug();</span> |
| <span class="source-line-no">3477</span><span id="line-3477"> return this;</span> |
| <span class="source-line-no">3478</span><span id="line-3478"> }</span> |
| <span class="source-line-no">3479</span><span id="line-3479"></span> |
| <span class="source-line-no">3480</span><span id="line-3480"> @Override /* GENERATED - org.apache.juneau.Context.Builder */</span> |
| <span class="source-line-no">3481</span><span id="line-3481"> public Builder debug(boolean value) {</span> |
| <span class="source-line-no">3482</span><span id="line-3482"> super.debug(value);</span> |
| <span class="source-line-no">3483</span><span id="line-3483"> return this;</span> |
| <span class="source-line-no">3484</span><span id="line-3484"> }</span> |
| <span class="source-line-no">3485</span><span id="line-3485"></span> |
| <span class="source-line-no">3486</span><span id="line-3486"> @Override /* GENERATED - org.apache.juneau.Context.Builder */</span> |
| <span class="source-line-no">3487</span><span id="line-3487"> public Builder impl(Context value) {</span> |
| <span class="source-line-no">3488</span><span id="line-3488"> super.impl(value);</span> |
| <span class="source-line-no">3489</span><span id="line-3489"> return this;</span> |
| <span class="source-line-no">3490</span><span id="line-3490"> }</span> |
| <span class="source-line-no">3491</span><span id="line-3491"></span> |
| <span class="source-line-no">3492</span><span id="line-3492"> @Override /* GENERATED - org.apache.juneau.Context.Builder */</span> |
| <span class="source-line-no">3493</span><span id="line-3493"> public Builder type(Class<? extends org.apache.juneau.Context> value) {</span> |
| <span class="source-line-no">3494</span><span id="line-3494"> super.type(value);</span> |
| <span class="source-line-no">3495</span><span id="line-3495"> return this;</span> |
| <span class="source-line-no">3496</span><span id="line-3496"> }</span> |
| <span class="source-line-no">3497</span><span id="line-3497"></span> |
| <span class="source-line-no">3498</span><span id="line-3498"> // </FluentSetters></span> |
| <span class="source-line-no">3499</span><span id="line-3499"></span> |
| <span class="source-line-no">3500</span><span id="line-3500"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">3501</span><span id="line-3501"> // Helpers</span> |
| <span class="source-line-no">3502</span><span id="line-3502"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">3503</span><span id="line-3503"></span> |
| <span class="source-line-no">3504</span><span id="line-3504"> private static Set<Class<?>> classSet() {</span> |
| <span class="source-line-no">3505</span><span id="line-3505"> return new TreeSet<>(Comparator.comparing(Class::getName));</span> |
| <span class="source-line-no">3506</span><span id="line-3506"> }</span> |
| <span class="source-line-no">3507</span><span id="line-3507"></span> |
| <span class="source-line-no">3508</span><span id="line-3508"> private static Set<Class<?>> classSet(Collection<Class<?>> copy) {</span> |
| <span class="source-line-no">3509</span><span id="line-3509"> return classSet(copy, false);</span> |
| <span class="source-line-no">3510</span><span id="line-3510"> }</span> |
| <span class="source-line-no">3511</span><span id="line-3511"></span> |
| <span class="source-line-no">3512</span><span id="line-3512"> private static Set<Class<?>> classSet(Collection<Class<?>> copy, boolean nullIfEmpty) {</span> |
| <span class="source-line-no">3513</span><span id="line-3513"> if (copy == null || (nullIfEmpty && copy.isEmpty()))</span> |
| <span class="source-line-no">3514</span><span id="line-3514"> return null;</span> |
| <span class="source-line-no">3515</span><span id="line-3515"> Set<Class<?>> x = classSet();</span> |
| <span class="source-line-no">3516</span><span id="line-3516"> x.addAll(copy);</span> |
| <span class="source-line-no">3517</span><span id="line-3517"> return x;</span> |
| <span class="source-line-no">3518</span><span id="line-3518"> }</span> |
| <span class="source-line-no">3519</span><span id="line-3519"> }</span> |
| <span class="source-line-no">3520</span><span id="line-3520"></span> |
| <span class="source-line-no">3521</span><span id="line-3521"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">3522</span><span id="line-3522"> // Instance</span> |
| <span class="source-line-no">3523</span><span id="line-3523"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">3524</span><span id="line-3524"></span> |
| <span class="source-line-no">3525</span><span id="line-3525"> final boolean</span> |
| <span class="source-line-no">3526</span><span id="line-3526"> beansRequireDefaultConstructor,</span> |
| <span class="source-line-no">3527</span><span id="line-3527"> beansRequireSerializable,</span> |
| <span class="source-line-no">3528</span><span id="line-3528"> beansRequireSettersForGetters,</span> |
| <span class="source-line-no">3529</span><span id="line-3529"> beansRequireSomeProperties,</span> |
| <span class="source-line-no">3530</span><span id="line-3530"> beanMapPutReturnsOldValue,</span> |
| <span class="source-line-no">3531</span><span id="line-3531"> useInterfaceProxies,</span> |
| <span class="source-line-no">3532</span><span id="line-3532"> ignoreUnknownBeanProperties,</span> |
| <span class="source-line-no">3533</span><span id="line-3533"> ignoreUnknownNullBeanProperties,</span> |
| <span class="source-line-no">3534</span><span id="line-3534"> ignoreUnknownEnumValues,</span> |
| <span class="source-line-no">3535</span><span id="line-3535"> ignoreMissingSetters,</span> |
| <span class="source-line-no">3536</span><span id="line-3536"> ignoreTransientFields,</span> |
| <span class="source-line-no">3537</span><span id="line-3537"> ignoreInvocationExceptionsOnGetters,</span> |
| <span class="source-line-no">3538</span><span id="line-3538"> ignoreInvocationExceptionsOnSetters,</span> |
| <span class="source-line-no">3539</span><span id="line-3539"> useJavaBeanIntrospector,</span> |
| <span class="source-line-no">3540</span><span id="line-3540"> useEnumNames,</span> |
| <span class="source-line-no">3541</span><span id="line-3541"> sortProperties,</span> |
| <span class="source-line-no">3542</span><span id="line-3542"> findFluentSetters;</span> |
| <span class="source-line-no">3543</span><span id="line-3543"> final Visibility</span> |
| <span class="source-line-no">3544</span><span id="line-3544"> beanConstructorVisibility,</span> |
| <span class="source-line-no">3545</span><span id="line-3545"> beanClassVisibility,</span> |
| <span class="source-line-no">3546</span><span id="line-3546"> beanMethodVisibility,</span> |
| <span class="source-line-no">3547</span><span id="line-3547"> beanFieldVisibility;</span> |
| <span class="source-line-no">3548</span><span id="line-3548"> final String typePropertyName;</span> |
| <span class="source-line-no">3549</span><span id="line-3549"> final Locale locale;</span> |
| <span class="source-line-no">3550</span><span id="line-3550"> final TimeZone timeZone;</span> |
| <span class="source-line-no">3551</span><span id="line-3551"> final MediaType mediaType;</span> |
| <span class="source-line-no">3552</span><span id="line-3552"> final Class<? extends PropertyNamer> propertyNamer;</span> |
| <span class="source-line-no">3553</span><span id="line-3553"> final List<Class<?>> beanDictionary, notBeanClasses;</span> |
| <span class="source-line-no">3554</span><span id="line-3554"> final List<Object> swaps;</span> |
| <span class="source-line-no">3555</span><span id="line-3555"> final List<String> notBeanPackages;</span> |
| <span class="source-line-no">3556</span><span id="line-3556"> final HashKey hashKey;</span> |
| <span class="source-line-no">3557</span><span id="line-3557"></span> |
| <span class="source-line-no">3558</span><span id="line-3558"> final Map<Class,ClassMeta> cmCache;</span> |
| <span class="source-line-no">3559</span><span id="line-3559"></span> |
| <span class="source-line-no">3560</span><span id="line-3560"> private final String[] notBeanPackageNames, notBeanPackagePrefixes;</span> |
| <span class="source-line-no">3561</span><span id="line-3561"> private final BeanRegistry beanRegistry;</span> |
| <span class="source-line-no">3562</span><span id="line-3562"> private final PropertyNamer propertyNamerBean;</span> |
| <span class="source-line-no">3563</span><span id="line-3563"> private final ObjectSwap[] swapArray;</span> |
| <span class="source-line-no">3564</span><span id="line-3564"> private final Class<?>[] notBeanClassesArray;</span> |
| <span class="source-line-no">3565</span><span id="line-3565"> private final ClassMeta<Object> cmObject; // Reusable ClassMeta that represents general Objects.</span> |
| <span class="source-line-no">3566</span><span id="line-3566"> private final ClassMeta<String> cmString; // Reusable ClassMeta that represents general Strings.</span> |
| <span class="source-line-no">3567</span><span id="line-3567"> private final ClassMeta<Class> cmClass; // Reusable ClassMeta that represents general Classes.</span> |
| <span class="source-line-no">3568</span><span id="line-3568"></span> |
| <span class="source-line-no">3569</span><span id="line-3569"> private final BeanSession defaultSession;</span> |
| <span class="source-line-no">3570</span><span id="line-3570"> private volatile WriterSerializer beanToStringSerializer;</span> |
| <span class="source-line-no">3571</span><span id="line-3571"></span> |
| <span class="source-line-no">3572</span><span id="line-3572"> /**</span> |
| <span class="source-line-no">3573</span><span id="line-3573"> * Constructor.</span> |
| <span class="source-line-no">3574</span><span id="line-3574"> *</span> |
| <span class="source-line-no">3575</span><span id="line-3575"> * @param builder The builder for this object.</span> |
| <span class="source-line-no">3576</span><span id="line-3576"> */</span> |
| <span class="source-line-no">3577</span><span id="line-3577"> public BeanContext(Builder builder) {</span> |
| <span class="source-line-no">3578</span><span id="line-3578"> super(builder);</span> |
| <span class="source-line-no">3579</span><span id="line-3579"></span> |
| <span class="source-line-no">3580</span><span id="line-3580"> hashKey = builder.hashKey();</span> |
| <span class="source-line-no">3581</span><span id="line-3581"></span> |
| <span class="source-line-no">3582</span><span id="line-3582"> beanConstructorVisibility = builder.beanConstructorVisibility;</span> |
| <span class="source-line-no">3583</span><span id="line-3583"> beanClassVisibility = builder.beanClassVisibility;</span> |
| <span class="source-line-no">3584</span><span id="line-3584"> beanMethodVisibility = builder.beanMethodVisibility;</span> |
| <span class="source-line-no">3585</span><span id="line-3585"> beanFieldVisibility = builder.beanFieldVisibility;</span> |
| <span class="source-line-no">3586</span><span id="line-3586"> beansRequireDefaultConstructor = builder.beansRequireDefaultConstructor;</span> |
| <span class="source-line-no">3587</span><span id="line-3587"> beansRequireSerializable = builder.beansRequireSerializable;</span> |
| <span class="source-line-no">3588</span><span id="line-3588"> beansRequireSettersForGetters = builder.beansRequireSettersForGetters;</span> |
| <span class="source-line-no">3589</span><span id="line-3589"> beansRequireSomeProperties = ! builder.disableBeansRequireSomeProperties;</span> |
| <span class="source-line-no">3590</span><span id="line-3590"> beanMapPutReturnsOldValue = builder.beanMapPutReturnsOldValue;</span> |
| <span class="source-line-no">3591</span><span id="line-3591"> useEnumNames = builder.useEnumNames;</span> |
| <span class="source-line-no">3592</span><span id="line-3592"> useInterfaceProxies = ! builder.disableInterfaceProxies;</span> |
| <span class="source-line-no">3593</span><span id="line-3593"> ignoreUnknownBeanProperties = builder.ignoreUnknownBeanProperties;</span> |
| <span class="source-line-no">3594</span><span id="line-3594"> ignoreUnknownNullBeanProperties = ! builder.disableIgnoreUnknownNullBeanProperties;</span> |
| <span class="source-line-no">3595</span><span id="line-3595"> ignoreUnknownEnumValues = builder.ignoreUnknownEnumValues;</span> |
| <span class="source-line-no">3596</span><span id="line-3596"> ignoreMissingSetters = ! builder.disableIgnoreMissingSetters;</span> |
| <span class="source-line-no">3597</span><span id="line-3597"> ignoreTransientFields = ! builder.disableIgnoreTransientFields;</span> |
| <span class="source-line-no">3598</span><span id="line-3598"> ignoreInvocationExceptionsOnGetters = builder.ignoreInvocationExceptionsOnGetters;</span> |
| <span class="source-line-no">3599</span><span id="line-3599"> ignoreInvocationExceptionsOnSetters = builder.ignoreInvocationExceptionsOnSetters;</span> |
| <span class="source-line-no">3600</span><span id="line-3600"> useJavaBeanIntrospector = builder.useJavaBeanIntrospector;</span> |
| <span class="source-line-no">3601</span><span id="line-3601"> sortProperties = builder.sortProperties;</span> |
| <span class="source-line-no">3602</span><span id="line-3602"> findFluentSetters = builder.findFluentSetters;</span> |
| <span class="source-line-no">3603</span><span id="line-3603"> typePropertyName = builder.typePropertyName != null ? builder.typePropertyName : "_type";</span> |
| <span class="source-line-no">3604</span><span id="line-3604"> locale = builder.locale != null ? builder.locale : Locale.getDefault();</span> |
| <span class="source-line-no">3605</span><span id="line-3605"> timeZone = builder.timeZone;</span> |
| <span class="source-line-no">3606</span><span id="line-3606"> mediaType = builder.mediaType;</span> |
| <span class="source-line-no">3607</span><span id="line-3607"> beanDictionary = optional(builder.beanDictionary).map(Collections::unmodifiableList).orElse(emptyList());</span> |
| <span class="source-line-no">3608</span><span id="line-3608"> swaps = optional(builder.swaps).map(Collections::unmodifiableList).orElse(emptyList());</span> |
| <span class="source-line-no">3609</span><span id="line-3609"> notBeanClasses = optional(builder.notBeanClasses).map(ArrayList::new).map(Collections::unmodifiableList).orElse(emptyList());</span> |
| <span class="source-line-no">3610</span><span id="line-3610"> notBeanPackages = optional(builder.notBeanPackages).map(ArrayList::new).map(Collections::unmodifiableList).orElse(emptyList());</span> |
| <span class="source-line-no">3611</span><span id="line-3611"> propertyNamer = builder.propertyNamer != null ? builder.propertyNamer : BasicPropertyNamer.class;</span> |
| <span class="source-line-no">3612</span><span id="line-3612"></span> |
| <span class="source-line-no">3613</span><span id="line-3613"> notBeanClassesArray = notBeanClasses.isEmpty() ? DEFAULT_NOTBEAN_CLASSES : Stream.of(notBeanClasses, alist(DEFAULT_NOTBEAN_CLASSES)).flatMap(Collection::stream).toArray(Class[]::new);</span> |
| <span class="source-line-no">3614</span><span id="line-3614"></span> |
| <span class="source-line-no">3615</span><span id="line-3615"> String[] _notBeanPackages = notBeanPackages.isEmpty() ? DEFAULT_NOTBEAN_PACKAGES : Stream.of(notBeanPackages, alist(DEFAULT_NOTBEAN_PACKAGES)).flatMap(Collection::stream).toArray(String[]::new);</span> |
| <span class="source-line-no">3616</span><span id="line-3616"> notBeanPackageNames = Stream.of(_notBeanPackages).filter(x -> ! x.endsWith(".*")).toArray(String[]::new);</span> |
| <span class="source-line-no">3617</span><span id="line-3617"> notBeanPackagePrefixes = Stream.of(_notBeanPackages).filter(x -> x.endsWith(".*")).map(x -> x.substring(0, x.length()-2)).toArray(String[]::new);</span> |
| <span class="source-line-no">3618</span><span id="line-3618"></span> |
| <span class="source-line-no">3619</span><span id="line-3619"> try {</span> |
| <span class="source-line-no">3620</span><span id="line-3620"> propertyNamerBean = propertyNamer.getDeclaredConstructor().newInstance();</span> |
| <span class="source-line-no">3621</span><span id="line-3621"> } catch (Exception e) {</span> |
| <span class="source-line-no">3622</span><span id="line-3622"> throw asRuntimeException(e);</span> |
| <span class="source-line-no">3623</span><span id="line-3623"> }</span> |
| <span class="source-line-no">3624</span><span id="line-3624"></span> |
| <span class="source-line-no">3625</span><span id="line-3625"> LinkedList<ObjectSwap<?,?>> _swaps = new LinkedList<>();</span> |
| <span class="source-line-no">3626</span><span id="line-3626"> swaps.forEach(x -> {</span> |
| <span class="source-line-no">3627</span><span id="line-3627"> if (x instanceof ObjectSwap) {</span> |
| <span class="source-line-no">3628</span><span id="line-3628"> _swaps.add((ObjectSwap<?,?>)x);</span> |
| <span class="source-line-no">3629</span><span id="line-3629"> } else {</span> |
| <span class="source-line-no">3630</span><span id="line-3630"> ClassInfo ci = ClassInfo.of((Class<?>)x);</span> |
| <span class="source-line-no">3631</span><span id="line-3631"> if (ci.isChildOf(ObjectSwap.class))</span> |
| <span class="source-line-no">3632</span><span id="line-3632"> _swaps.add(BeanCreator.of(ObjectSwap.class).type(ci).run());</span> |
| <span class="source-line-no">3633</span><span id="line-3633"> else if (ci.isChildOf(Surrogate.class))</span> |
| <span class="source-line-no">3634</span><span id="line-3634"> _swaps.addAll(SurrogateSwap.findObjectSwaps(ci.inner(), this));</span> |
| <span class="source-line-no">3635</span><span id="line-3635"> else</span> |
| <span class="source-line-no">3636</span><span id="line-3636"> throw new BasicRuntimeException("Invalid class {0} specified in BeanContext.swaps property. Must be a subclass of ObjectSwap or Surrogate.", ci.inner());</span> |
| <span class="source-line-no">3637</span><span id="line-3637"> }</span> |
| <span class="source-line-no">3638</span><span id="line-3638"> });</span> |
| <span class="source-line-no">3639</span><span id="line-3639"> swapArray = _swaps.toArray(new ObjectSwap[_swaps.size()]);</span> |
| <span class="source-line-no">3640</span><span id="line-3640"></span> |
| <span class="source-line-no">3641</span><span id="line-3641"> cmCache = new ConcurrentHashMap<>();</span> |
| <span class="source-line-no">3642</span><span id="line-3642"> cmCache.put(String.class, new ClassMeta(String.class, this, findObjectSwaps(String.class), findChildObjectSwaps(String.class)));</span> |
| <span class="source-line-no">3643</span><span id="line-3643"> cmCache.put(Object.class, new ClassMeta(Object.class, this, findObjectSwaps(Object.class), findChildObjectSwaps(Object.class)));</span> |
| <span class="source-line-no">3644</span><span id="line-3644"> cmString = cmCache.get(String.class);</span> |
| <span class="source-line-no">3645</span><span id="line-3645"> cmObject = cmCache.get(Object.class);</span> |
| <span class="source-line-no">3646</span><span id="line-3646"> cmClass = cmCache.get(Class.class);</span> |
| <span class="source-line-no">3647</span><span id="line-3647"></span> |
| <span class="source-line-no">3648</span><span id="line-3648"> beanRegistry = new BeanRegistry(this, null);</span> |
| <span class="source-line-no">3649</span><span id="line-3649"> defaultSession = createSession().unmodifiable().build();</span> |
| <span class="source-line-no">3650</span><span id="line-3650"> }</span> |
| <span class="source-line-no">3651</span><span id="line-3651"></span> |
| <span class="source-line-no">3652</span><span id="line-3652"> @Override /* Context */</span> |
| <span class="source-line-no">3653</span><span id="line-3653"> public Builder copy() {</span> |
| <span class="source-line-no">3654</span><span id="line-3654"> return new Builder(this);</span> |
| <span class="source-line-no">3655</span><span id="line-3655"> }</span> |
| <span class="source-line-no">3656</span><span id="line-3656"></span> |
| <span class="source-line-no">3657</span><span id="line-3657"> @Override /* Context */</span> |
| <span class="source-line-no">3658</span><span id="line-3658"> public BeanSession.Builder createSession() {</span> |
| <span class="source-line-no">3659</span><span id="line-3659"> return BeanSession.create(this);</span> |
| <span class="source-line-no">3660</span><span id="line-3660"> }</span> |
| <span class="source-line-no">3661</span><span id="line-3661"></span> |
| <span class="source-line-no">3662</span><span id="line-3662"> @Override /* Context */</span> |
| <span class="source-line-no">3663</span><span id="line-3663"> public BeanSession getSession() {</span> |
| <span class="source-line-no">3664</span><span id="line-3664"> return defaultSession;</span> |
| <span class="source-line-no">3665</span><span id="line-3665"> }</span> |
| <span class="source-line-no">3666</span><span id="line-3666"></span> |
| <span class="source-line-no">3667</span><span id="line-3667"> /**</span> |
| <span class="source-line-no">3668</span><span id="line-3668"> * Returns <jk>true</jk> if the specified bean context shares the same cache as this bean context.</span> |
| <span class="source-line-no">3669</span><span id="line-3669"> *</span> |
| <span class="source-line-no">3670</span><span id="line-3670"> * <p></span> |
| <span class="source-line-no">3671</span><span id="line-3671"> * Useful for testing purposes.</span> |
| <span class="source-line-no">3672</span><span id="line-3672"> *</span> |
| <span class="source-line-no">3673</span><span id="line-3673"> * @param bc The bean context to compare to.</span> |
| <span class="source-line-no">3674</span><span id="line-3674"> * @return <jk>true</jk> if the bean contexts have equivalent settings and thus share caches.</span> |
| <span class="source-line-no">3675</span><span id="line-3675"> */</span> |
| <span class="source-line-no">3676</span><span id="line-3676"> public final boolean hasSameCache(BeanContext bc) {</span> |
| <span class="source-line-no">3677</span><span id="line-3677"> return bc.cmCache == this.cmCache;</span> |
| <span class="source-line-no">3678</span><span id="line-3678"> }</span> |
| <span class="source-line-no">3679</span><span id="line-3679"></span> |
| <span class="source-line-no">3680</span><span id="line-3680"> /**</span> |
| <span class="source-line-no">3681</span><span id="line-3681"> * Wraps an object inside a {@link BeanMap} object (a modifiable {@link Map}).</span> |
| <span class="source-line-no">3682</span><span id="line-3682"> *</span> |
| <span class="source-line-no">3683</span><span id="line-3683"> * <p></span> |
| <span class="source-line-no">3684</span><span id="line-3684"> * This is a shortcut for the following code: <c>createSession().build().toBeanMap(<jv>object</jv>);</c></span> |
| <span class="source-line-no">3685</span><span id="line-3685"> *</span> |
| <span class="source-line-no">3686</span><span id="line-3686"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">3687</span><span id="line-3687"> * <p class='bjava'></span> |
| <span class="source-line-no">3688</span><span id="line-3688"> * <jc>// Construct a bean map around a bean instance</jc></span> |
| <span class="source-line-no">3689</span><span id="line-3689"> * BeanMap&lt;Person&gt; <jv>beanMap</jv> = BeanContext.<jsf>DEFAULT</jsf>.toBeanMap(<jk>new</jk> Person());</span> |
| <span class="source-line-no">3690</span><span id="line-3690"> * </p></span> |
| <span class="source-line-no">3691</span><span id="line-3691"> *</span> |
| <span class="source-line-no">3692</span><span id="line-3692"> * @param <T> The class of the object being wrapped.</span> |
| <span class="source-line-no">3693</span><span id="line-3693"> * @param object The object to wrap in a map interface. Must not be null.</span> |
| <span class="source-line-no">3694</span><span id="line-3694"> * @return The wrapped object.</span> |
| <span class="source-line-no">3695</span><span id="line-3695"> * @see BeanSession#toBeanMap(Object)</span> |
| <span class="source-line-no">3696</span><span id="line-3696"> */</span> |
| <span class="source-line-no">3697</span><span id="line-3697"> public <T> BeanMap<T> toBeanMap(T object) {</span> |
| <span class="source-line-no">3698</span><span id="line-3698"> return defaultSession.toBeanMap(object);</span> |
| <span class="source-line-no">3699</span><span id="line-3699"> }</span> |
| <span class="source-line-no">3700</span><span id="line-3700"></span> |
| <span class="source-line-no">3701</span><span id="line-3701"> /**</span> |
| <span class="source-line-no">3702</span><span id="line-3702"> * Creates a new {@link BeanMap} object (a modifiable {@link Map}) of the given class with uninitialized</span> |
| <span class="source-line-no">3703</span><span id="line-3703"> * property values.</span> |
| <span class="source-line-no">3704</span><span id="line-3704"> *</span> |
| <span class="source-line-no">3705</span><span id="line-3705"> * <p></span> |
| <span class="source-line-no">3706</span><span id="line-3706"> * This is a shortcut for the following code: <c>createSession().build().newBeanMap(<jv>_class</jv>);</c></span> |
| <span class="source-line-no">3707</span><span id="line-3707"> *</span> |
| <span class="source-line-no">3708</span><span id="line-3708"> * <h5 class='section'>Example:</h5></span> |
| <span class="source-line-no">3709</span><span id="line-3709"> * <p class='bjava'></span> |
| <span class="source-line-no">3710</span><span id="line-3710"> * <jc>// Construct a new bean map wrapped around a new Person object</jc></span> |
| <span class="source-line-no">3711</span><span id="line-3711"> * BeanMap&lt;Person&gt; <jv>beanMap</jv> = BeanContext.<jsf>DEFAULT</jsf>.newBeanMap(Person.<jk>class</jk>);</span> |
| <span class="source-line-no">3712</span><span id="line-3712"> * </p></span> |
| <span class="source-line-no">3713</span><span id="line-3713"> *</span> |
| <span class="source-line-no">3714</span><span id="line-3714"> * @param <T> The class of the object being wrapped.</span> |
| <span class="source-line-no">3715</span><span id="line-3715"> * @param c The name of the class to create a new instance of.</span> |
| <span class="source-line-no">3716</span><span id="line-3716"> * @return A new instance of the class.</span> |
| <span class="source-line-no">3717</span><span id="line-3717"> * @see BeanSession#newBeanMap(Class)</span> |
| <span class="source-line-no">3718</span><span id="line-3718"> */</span> |
| <span class="source-line-no">3719</span><span id="line-3719"> public <T> BeanMap<T> newBeanMap(Class<T> c) {</span> |
| <span class="source-line-no">3720</span><span id="line-3720"> return defaultSession.newBeanMap(c);</span> |
| <span class="source-line-no">3721</span><span id="line-3721"> }</span> |
| <span class="source-line-no">3722</span><span id="line-3722"></span> |
| <span class="source-line-no">3723</span><span id="line-3723"> /**</span> |
| <span class="source-line-no">3724</span><span id="line-3724"> * Converts the specified value to the specified class type.</span> |
| <span class="source-line-no">3725</span><span id="line-3725"> *</span> |
| <span class="source-line-no">3726</span><span id="line-3726"> * <p></span> |
| <span class="source-line-no">3727</span><span id="line-3727"> * This is a shortcut for the following code: <c>createSession().build().convertToType(<jv>value</jv>, <jv>type</jv>);</c></span> |
| <span class="source-line-no">3728</span><span id="line-3728"> *</span> |
| <span class="source-line-no">3729</span><span id="line-3729"> * @param <T> The class type to convert the value to.</span> |
| <span class="source-line-no">3730</span><span id="line-3730"> * @param value The value to convert.</span> |
| <span class="source-line-no">3731</span><span id="line-3731"> * @param type The class type to convert the value to.</span> |
| <span class="source-line-no">3732</span><span id="line-3732"> * @throws InvalidDataConversionException If the specified value cannot be converted to the specified type.</span> |
| <span class="source-line-no">3733</span><span id="line-3733"> * @return The converted value.</span> |
| <span class="source-line-no">3734</span><span id="line-3734"> * @see BeanSession#convertToType(Object, Class)</span> |
| <span class="source-line-no">3735</span><span id="line-3735"> */</span> |
| <span class="source-line-no">3736</span><span id="line-3736"> public final <T> T convertToType(Object value, Class<T> type) throws InvalidDataConversionException {</span> |
| <span class="source-line-no">3737</span><span id="line-3737"> return defaultSession.convertToType(value, type);</span> |
| <span class="source-line-no">3738</span><span id="line-3738"> }</span> |
| <span class="source-line-no">3739</span><span id="line-3739"></span> |
| <span class="source-line-no">3740</span><span id="line-3740"> /**</span> |
| <span class="source-line-no">3741</span><span id="line-3741"> * Same as {@link #convertToType(Object, Class)}, except used for instantiating inner member classes that must</span> |
| <span class="source-line-no">3742</span><span id="line-3742"> * be instantiated within another class instance.</span> |
| <span class="source-line-no">3743</span><span id="line-3743"> *</span> |
| <span class="source-line-no">3744</span><span id="line-3744"> * <p></span> |
| <span class="source-line-no">3745</span><span id="line-3745"> * This is a shortcut for the following code: <c>createSession().build().convertToMemberType(<jv>outer</jv>, <jv>value</jv>, <jv>type</jv>);</c></span> |
| <span class="source-line-no">3746</span><span id="line-3746"> *</span> |
| <span class="source-line-no">3747</span><span id="line-3747"> * @param <T> The class type to convert the value to.</span> |
| <span class="source-line-no">3748</span><span id="line-3748"> * @param outer</span> |
| <span class="source-line-no">3749</span><span id="line-3749"> * If class is a member class, this is the instance of the containing class.</span> |
| <span class="source-line-no">3750</span><span id="line-3750"> * Should be <jk>null</jk> if not a member class.</span> |
| <span class="source-line-no">3751</span><span id="line-3751"> * @param value The value to convert.</span> |
| <span class="source-line-no">3752</span><span id="line-3752"> * @param type The class type to convert the value to.</span> |
| <span class="source-line-no">3753</span><span id="line-3753"> * @throws InvalidDataConversionException If the specified value cannot be converted to the specified type.</span> |
| <span class="source-line-no">3754</span><span id="line-3754"> * @return The converted value.</span> |
| <span class="source-line-no">3755</span><span id="line-3755"> * @see BeanSession#convertToMemberType(Object, Object, Class)</span> |
| <span class="source-line-no">3756</span><span id="line-3756"> */</span> |
| <span class="source-line-no">3757</span><span id="line-3757"> public final <T> T convertToMemberType(Object outer, Object value, Class<T> type) throws InvalidDataConversionException {</span> |
| <span class="source-line-no">3758</span><span id="line-3758"> return defaultSession.convertToMemberType(outer, value, getClassMeta(type));</span> |
| <span class="source-line-no">3759</span><span id="line-3759"> }</span> |
| <span class="source-line-no">3760</span><span id="line-3760"></span> |
| <span class="source-line-no">3761</span><span id="line-3761"> /**</span> |
| <span class="source-line-no">3762</span><span id="line-3762"> * Same as {@link #convertToType(Object, Class)}, but allows for complex data types consisting of collections or maps.</span> |
| <span class="source-line-no">3763</span><span id="line-3763"> *</span> |
| <span class="source-line-no">3764</span><span id="line-3764"> * <p></span> |
| <span class="source-line-no">3765</span><span id="line-3765"> * This is a shortcut for the following code: <c>createSession().build().convertToType(<jv>value</jv>, <jv>type</jv>, <jv>args</jv>);</c></span> |
| <span class="source-line-no">3766</span><span id="line-3766"> *</span> |
| <span class="source-line-no">3767</span><span id="line-3767"> * @param <T> The class type to convert the value to.</span> |
| <span class="source-line-no">3768</span><span id="line-3768"> * @param value The value to be converted.</span> |
| <span class="source-line-no">3769</span><span id="line-3769"> * @param type The target object type.</span> |
| <span class="source-line-no">3770</span><span id="line-3770"> * @param args The target object parameter types.</span> |
| <span class="source-line-no">3771</span><span id="line-3771"> * @return The converted type.</span> |
| <span class="source-line-no">3772</span><span id="line-3772"> * @throws InvalidDataConversionException If the specified value cannot be converted to the specified type.</span> |
| <span class="source-line-no">3773</span><span id="line-3773"> * @see BeanSession#convertToType(Object, Type, Type...)</span> |
| <span class="source-line-no">3774</span><span id="line-3774"> */</span> |
| <span class="source-line-no">3775</span><span id="line-3775"> public final <T> T convertToType(Object value, Type type, Type...args) throws InvalidDataConversionException {</span> |
| <span class="source-line-no">3776</span><span id="line-3776"> return (T)defaultSession.convertToMemberType(null, value, getClassMeta(type, args));</span> |
| <span class="source-line-no">3777</span><span id="line-3777"> }</span> |
| <span class="source-line-no">3778</span><span id="line-3778"></span> |
| <span class="source-line-no">3779</span><span id="line-3779"> /**</span> |
| <span class="source-line-no">3780</span><span id="line-3780"> * Determines whether the specified class is ignored as a bean class based on the various exclusion parameters</span> |
| <span class="source-line-no">3781</span><span id="line-3781"> * specified on this context class.</span> |
| <span class="source-line-no">3782</span><span id="line-3782"> *</span> |
| <span class="source-line-no">3783</span><span id="line-3783"> * @param c The class type being tested.</span> |
| <span class="source-line-no">3784</span><span id="line-3784"> * @return <jk>true</jk> if the specified class matches any of the exclusion parameters.</span> |
| <span class="source-line-no">3785</span><span id="line-3785"> */</span> |
| <span class="source-line-no">3786</span><span id="line-3786"> protected final boolean isNotABean(Class<?> c) {</span> |
| <span class="source-line-no">3787</span><span id="line-3787"> if (c.isArray() || c.isPrimitive() || c.isEnum() || c.isAnnotation())</span> |
| <span class="source-line-no">3788</span><span id="line-3788"> return true;</span> |
| <span class="source-line-no">3789</span><span id="line-3789"> Package p = c.getPackage();</span> |
| <span class="source-line-no">3790</span><span id="line-3790"> if (p != null) {</span> |
| <span class="source-line-no">3791</span><span id="line-3791"> for (String p2 : notBeanPackageNames)</span> |
| <span class="source-line-no">3792</span><span id="line-3792"> if (p.getName().equals(p2))</span> |
| <span class="source-line-no">3793</span><span id="line-3793"> return true;</span> |
| <span class="source-line-no">3794</span><span id="line-3794"> for (String p2 : notBeanPackagePrefixes)</span> |
| <span class="source-line-no">3795</span><span id="line-3795"> if (p.getName().startsWith(p2))</span> |
| <span class="source-line-no">3796</span><span id="line-3796"> return true;</span> |
| <span class="source-line-no">3797</span><span id="line-3797"> }</span> |
| <span class="source-line-no">3798</span><span id="line-3798"> ClassInfo ci = ClassInfo.of(c);</span> |
| <span class="source-line-no">3799</span><span id="line-3799"> for (Class exclude : notBeanClassesArray)</span> |
| <span class="source-line-no">3800</span><span id="line-3800"> if (ci.isChildOf(exclude))</span> |
| <span class="source-line-no">3801</span><span id="line-3801"> return true;</span> |
| <span class="source-line-no">3802</span><span id="line-3802"> return false;</span> |
| <span class="source-line-no">3803</span><span id="line-3803"> }</span> |
| <span class="source-line-no">3804</span><span id="line-3804"></span> |
| <span class="source-line-no">3805</span><span id="line-3805"> /**</span> |
| <span class="source-line-no">3806</span><span id="line-3806"> * Returns <jk>true</jk> if the specified object is a bean.</span> |
| <span class="source-line-no">3807</span><span id="line-3807"> *</span> |
| <span class="source-line-no">3808</span><span id="line-3808"> * @param o The object to test.</span> |
| <span class="source-line-no">3809</span><span id="line-3809"> * @return <jk>true</jk> if the specified object is a bean. <jk>false</jk> if the bean is <jk>null</jk>.</span> |
| <span class="source-line-no">3810</span><span id="line-3810"> */</span> |
| <span class="source-line-no">3811</span><span id="line-3811"> public boolean isBean(Object o) {</span> |
| <span class="source-line-no">3812</span><span id="line-3812"> if (o == null)</span> |
| <span class="source-line-no">3813</span><span id="line-3813"> return false;</span> |
| <span class="source-line-no">3814</span><span id="line-3814"> return getClassMetaForObject(o).isBean();</span> |
| <span class="source-line-no">3815</span><span id="line-3815"> }</span> |
| <span class="source-line-no">3816</span><span id="line-3816"></span> |
| <span class="source-line-no">3817</span><span id="line-3817"> /**</span> |
| <span class="source-line-no">3818</span><span id="line-3818"> * Returns the {@link BeanMeta} class for the specified class.</span> |
| <span class="source-line-no">3819</span><span id="line-3819"> *</span> |
| <span class="source-line-no">3820</span><span id="line-3820"> * @param <T> The class type to get the meta-data on.</span> |
| <span class="source-line-no">3821</span><span id="line-3821"> * @param c The class to get the meta-data on.</span> |
| <span class="source-line-no">3822</span><span id="line-3822"> * @return</span> |
| <span class="source-line-no">3823</span><span id="line-3823"> * The {@link BeanMeta} for the specified class, or <jk>null</jk> if the class is not a bean per the settings on</span> |
| <span class="source-line-no">3824</span><span id="line-3824"> * this context.</span> |
| <span class="source-line-no">3825</span><span id="line-3825"> */</span> |
| <span class="source-line-no">3826</span><span id="line-3826"> public final <T> BeanMeta<T> getBeanMeta(Class<T> c) {</span> |
| <span class="source-line-no">3827</span><span id="line-3827"> if (c == null)</span> |
| <span class="source-line-no">3828</span><span id="line-3828"> return null;</span> |
| <span class="source-line-no">3829</span><span id="line-3829"> return getClassMeta(c).getBeanMeta();</span> |
| <span class="source-line-no">3830</span><span id="line-3830"> }</span> |
| <span class="source-line-no">3831</span><span id="line-3831"></span> |
| <span class="source-line-no">3832</span><span id="line-3832"> /**</span> |
| <span class="source-line-no">3833</span><span id="line-3833"> * Construct a {@code ClassMeta} wrapper around a {@link Class} object.</span> |
| <span class="source-line-no">3834</span><span id="line-3834"> *</span> |
| <span class="source-line-no">3835</span><span id="line-3835"> * @param <T> The class type being wrapped.</span> |
| <span class="source-line-no">3836</span><span id="line-3836"> * @param type The class to resolve.</span> |
| <span class="source-line-no">3837</span><span id="line-3837"> * @return</span> |
| <span class="source-line-no">3838</span><span id="line-3838"> * If the class is not an array, returns a cached {@link ClassMeta} object.</span> |
| <span class="source-line-no">3839</span><span id="line-3839"> * Otherwise, returns a new {@link ClassMeta} object every time.</span> |
| <span class="source-line-no">3840</span><span id="line-3840"> */</span> |
| <span class="source-line-no">3841</span><span id="line-3841"> public final <T> ClassMeta<T> getClassMeta(Class<T> type) {</span> |
| <span class="source-line-no">3842</span><span id="line-3842"> return getClassMeta(type, true);</span> |
| <span class="source-line-no">3843</span><span id="line-3843"> }</span> |
| <span class="source-line-no">3844</span><span id="line-3844"></span> |
| <span class="source-line-no">3845</span><span id="line-3845"> /**</span> |
| <span class="source-line-no">3846</span><span id="line-3846"> * Construct a {@code ClassMeta} wrapper around a {@link Class} object.</span> |
| <span class="source-line-no">3847</span><span id="line-3847"> *</span> |
| <span class="source-line-no">3848</span><span id="line-3848"> * @param <T> The class type being wrapped.</span> |
| <span class="source-line-no">3849</span><span id="line-3849"> * @param type The class to resolve.</span> |
| <span class="source-line-no">3850</span><span id="line-3850"> * @param waitForInit</span> |
| <span class="source-line-no">3851</span><span id="line-3851"> * When enabled, wait for the ClassMeta constructor to finish before returning.</span> |
| <span class="source-line-no">3852</span><span id="line-3852"> * @return</span> |
| <span class="source-line-no">3853</span><span id="line-3853"> * If the class is not an array, returns a cached {@link ClassMeta} object.</span> |
| <span class="source-line-no">3854</span><span id="line-3854"> * Otherwise, returns a new {@link ClassMeta} object every time.</span> |
| <span class="source-line-no">3855</span><span id="line-3855"> */</span> |
| <span class="source-line-no">3856</span><span id="line-3856"> final <T> ClassMeta<T> getClassMeta(Class<T> type, boolean waitForInit) {</span> |
| <span class="source-line-no">3857</span><span id="line-3857"></span> |
| <span class="source-line-no">3858</span><span id="line-3858"> // This can happen if we have transforms defined against String or Object.</span> |
| <span class="source-line-no">3859</span><span id="line-3859"> if (cmCache == null)</span> |
| <span class="source-line-no">3860</span><span id="line-3860"> return null;</span> |
| <span class="source-line-no">3861</span><span id="line-3861"></span> |
| <span class="source-line-no">3862</span><span id="line-3862"> ClassMeta<T> cm = cmCache.get(type);</span> |
| <span class="source-line-no">3863</span><span id="line-3863"> if (cm == null) {</span> |
| <span class="source-line-no">3864</span><span id="line-3864"></span> |
| <span class="source-line-no">3865</span><span id="line-3865"> synchronized (this) {</span> |
| <span class="source-line-no">3866</span><span id="line-3866"> // Make sure someone didn't already set it while this thread was blocked.</span> |
| <span class="source-line-no">3867</span><span id="line-3867"> cm = cmCache.get(type);</span> |
| <span class="source-line-no">3868</span><span id="line-3868"> if (cm == null)</span> |
| <span class="source-line-no">3869</span><span id="line-3869"> cm = new ClassMeta<>(type, this, findObjectSwaps(type), findChildObjectSwaps(type));</span> |
| <span class="source-line-no">3870</span><span id="line-3870"> }</span> |
| <span class="source-line-no">3871</span><span id="line-3871"> }</span> |
| <span class="source-line-no">3872</span><span id="line-3872"> if (waitForInit)</span> |
| <span class="source-line-no">3873</span><span id="line-3873"> cm.waitForInit();</span> |
| <span class="source-line-no">3874</span><span id="line-3874"> return cm;</span> |
| <span class="source-line-no">3875</span><span id="line-3875"> }</span> |
| <span class="source-line-no">3876</span><span id="line-3876"></span> |
| <span class="source-line-no">3877</span><span id="line-3877"> /**</span> |
| <span class="source-line-no">3878</span><span id="line-3878"> * Used to resolve <c>ClassMetas</c> of type <c>Collection</c> and <c>Map</c> that have</span> |
| <span class="source-line-no">3879</span><span id="line-3879"> * <c>ClassMeta</c> values that themselves could be collections or maps.</span> |
| <span class="source-line-no">3880</span><span id="line-3880"> *</span> |
| <span class="source-line-no">3881</span><span id="line-3881"> * <p></span> |
| <span class="source-line-no">3882</span><span id="line-3882"> * <c>Collection</c> meta objects are assumed to be followed by zero or one meta objects indicating the element type.</span> |
| <span class="source-line-no">3883</span><span id="line-3883"> *</span> |
| <span class="source-line-no">3884</span><span id="line-3884"> * <p></span> |
| <span class="source-line-no">3885</span><span id="line-3885"> * <c>Map</c> meta objects are assumed to be followed by zero or two meta objects indicating the key and value types.</span> |
| <span class="source-line-no">3886</span><span id="line-3886"> *</span> |
| <span class="source-line-no">3887</span><span id="line-3887"> * <p></span> |
| <span class="source-line-no">3888</span><span id="line-3888"> * The array can be arbitrarily long to indicate arbitrarily complex data structures.</span> |
| <span class="source-line-no">3889</span><span id="line-3889"> *</span> |
| <span class="source-line-no">3890</span><span id="line-3890"> * <h5 class='section'>Examples:</h5></span> |
| <span class="source-line-no">3891</span><span id="line-3891"> * <ul></span> |
| <span class="source-line-no">3892</span><span id="line-3892"> * <li><code>getClassMeta(String.<jk>class</jk>);</code> - A normal type.</span> |
| <span class="source-line-no">3893</span><span id="line-3893"> * <li><code>getClassMeta(List.<jk>class</jk>);</code> - A list containing objects.</span> |
| <span class="source-line-no">3894</span><span id="line-3894"> * <li><code>getClassMeta(List.<jk>class</jk>, String.<jk>class</jk>);</code> - A list containing strings.</span> |
| <span class="source-line-no">3895</span><span id="line-3895"> * <li><code>getClassMeta(LinkedList.<jk>class</jk>, String.<jk>class</jk>);</code> - A linked-list containing</span> |
| <span class="source-line-no">3896</span><span id="line-3896"> * strings.</span> |
| <span class="source-line-no">3897</span><span id="line-3897"> * <li><code>getClassMeta(LinkedList.<jk>class</jk>, LinkedList.<jk>class</jk>, String.<jk>class</jk>);</code> -</span> |
| <span class="source-line-no">3898</span><span id="line-3898"> * A linked-list containing linked-lists of strings.</span> |
| <span class="source-line-no">3899</span><span id="line-3899"> * <li><code>getClassMeta(Map.<jk>class</jk>);</code> - A map containing object keys/values.</span> |
| <span class="source-line-no">3900</span><span id="line-3900"> * <li><code>getClassMeta(Map.<jk>class</jk>, String.<jk>class</jk>, String.<jk>class</jk>);</code> - A map</span> |
| <span class="source-line-no">3901</span><span id="line-3901"> * containing string keys/values.</span> |
| <span class="source-line-no">3902</span><span id="line-3902"> * <li><code>getClassMeta(Map.<jk>class</jk>, String.<jk>class</jk>, List.<jk>class</jk>, MyBean.<jk>class</jk>);</code> -</span> |
| <span class="source-line-no">3903</span><span id="line-3903"> * A map containing string keys and values of lists containing beans.</span> |
| <span class="source-line-no">3904</span><span id="line-3904"> * </ul></span> |
| <span class="source-line-no">3905</span><span id="line-3905"> *</span> |
| <span class="source-line-no">3906</span><span id="line-3906"> * @param <T></span> |
| <span class="source-line-no">3907</span><span id="line-3907"> * The class to resolve.</span> |
| <span class="source-line-no">3908</span><span id="line-3908"> * @param type</span> |
| <span class="source-line-no">3909</span><span id="line-3909"> * The class to resolve.</span> |
| <span class="source-line-no">3910</span><span id="line-3910"> * <br>Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}</span> |
| <span class="source-line-no">3911</span><span id="line-3911"> * @param args</span> |
| <span class="source-line-no">3912</span><span id="line-3912"> * The type arguments of the class if it's a collection or map.</span> |
| <span class="source-line-no">3913</span><span id="line-3913"> * <br>Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}</span> |
| <span class="source-line-no">3914</span><span id="line-3914"> * <br>Ignored if the main type is not a map or collection.</span> |
| <span class="source-line-no">3915</span><span id="line-3915"> * @return The resolved class meta.</span> |
| <span class="source-line-no">3916</span><span id="line-3916"> */</span> |
| <span class="source-line-no">3917</span><span id="line-3917"> public final <T> ClassMeta<T> getClassMeta(Type type, Type...args) {</span> |
| <span class="source-line-no">3918</span><span id="line-3918"> if (type == null)</span> |
| <span class="source-line-no">3919</span><span id="line-3919"> return null;</span> |
| <span class="source-line-no">3920</span><span id="line-3920"> ClassMeta<T> cm = type instanceof Class ? getClassMeta((Class)type) : resolveClassMeta(type, null);</span> |
| <span class="source-line-no">3921</span><span id="line-3921"> if (args.length == 0)</span> |
| <span class="source-line-no">3922</span><span id="line-3922"> return cm;</span> |
| <span class="source-line-no">3923</span><span id="line-3923"> ClassMeta<?>[] cma = new ClassMeta[args.length+1];</span> |
| <span class="source-line-no">3924</span><span id="line-3924"> cma[0] = cm;</span> |
| <span class="source-line-no">3925</span><span id="line-3925"> for (int i = 0; i < Array.getLength(args); i++) {</span> |
| <span class="source-line-no">3926</span><span id="line-3926"> Type arg = (Type)Array.get(args, i);</span> |
| <span class="source-line-no">3927</span><span id="line-3927"> cma[i+1] = arg instanceof Class ? getClassMeta((Class)arg) : resolveClassMeta(arg, null);</span> |
| <span class="source-line-no">3928</span><span id="line-3928"> }</span> |
| <span class="source-line-no">3929</span><span id="line-3929"> return (ClassMeta<T>) getTypedClassMeta(cma, 0);</span> |
| <span class="source-line-no">3930</span><span id="line-3930"> }</span> |
| <span class="source-line-no">3931</span><span id="line-3931"></span> |
| <span class="source-line-no">3932</span><span id="line-3932"> /*</span> |
| <span class="source-line-no">3933</span><span id="line-3933"> * Resolves the 'genericized' class meta at the specified position in the ClassMeta array.</span> |
| <span class="source-line-no">3934</span><span id="line-3934"> */</span> |
| <span class="source-line-no">3935</span><span id="line-3935"> private ClassMeta<?> getTypedClassMeta(ClassMeta<?>[] c, int pos) {</span> |
| <span class="source-line-no">3936</span><span id="line-3936"> ClassMeta<?> cm = c[pos++];</span> |
| <span class="source-line-no">3937</span><span id="line-3937"> if (cm.isCollection() || cm.isOptional()) {</span> |
| <span class="source-line-no">3938</span><span id="line-3938"> ClassMeta<?> ce = c.length == pos ? object() : getTypedClassMeta(c, pos);</span> |
| <span class="source-line-no">3939</span><span id="line-3939"> return (ce.isObject() ? cm : new ClassMeta(cm, null, null, ce));</span> |
| <span class="source-line-no">3940</span><span id="line-3940"> } else if (cm.isMap()) {</span> |
| <span class="source-line-no">3941</span><span id="line-3941"> ClassMeta<?> ck = c.length == pos ? object() : c[pos++];</span> |
| <span class="source-line-no">3942</span><span id="line-3942"> ClassMeta<?> cv = c.length == pos ? object() : getTypedClassMeta(c, pos);</span> |
| <span class="source-line-no">3943</span><span id="line-3943"> return (ck.isObject() && cv.isObject() ? cm : new ClassMeta(cm, ck, cv, null));</span> |
| <span class="source-line-no">3944</span><span id="line-3944"> }</span> |
| <span class="source-line-no">3945</span><span id="line-3945"> return cm;</span> |
| <span class="source-line-no">3946</span><span id="line-3946"> }</span> |
| <span class="source-line-no">3947</span><span id="line-3947"></span> |
| <span class="source-line-no">3948</span><span id="line-3948"> final ClassMeta resolveClassMeta(Type o, Map<Class<?>,Class<?>[]> typeVarImpls) {</span> |
| <span class="source-line-no">3949</span><span id="line-3949"> if (o == null)</span> |
| <span class="source-line-no">3950</span><span id="line-3950"> return null;</span> |
| <span class="source-line-no">3951</span><span id="line-3951"></span> |
| <span class="source-line-no">3952</span><span id="line-3952"> if (o instanceof ClassMeta) {</span> |
| <span class="source-line-no">3953</span><span id="line-3953"> ClassMeta<?> cm = (ClassMeta)o;</span> |
| <span class="source-line-no">3954</span><span id="line-3954"></span> |
| <span class="source-line-no">3955</span><span id="line-3955"> // This classmeta could have been created by a different context.</span> |
| <span class="source-line-no">3956</span><span id="line-3956"> // Need to re-resolve it to pick up ObjectSwaps and stuff on this context.</span> |
| <span class="source-line-no">3957</span><span id="line-3957"> if (cm.getBeanContext() == this)</span> |
| <span class="source-line-no">3958</span><span id="line-3958"> return cm;</span> |
| <span class="source-line-no">3959</span><span id="line-3959"> if (cm.isMap())</span> |
| <span class="source-line-no">3960</span><span id="line-3960"> return getClassMeta(cm.innerClass, cm.getKeyType(), cm.getValueType());</span> |
| <span class="source-line-no">3961</span><span id="line-3961"> if (cm.isCollection() || cm.isOptional())</span> |
| <span class="source-line-no">3962</span><span id="line-3962"> return getClassMeta(cm.innerClass, cm.getElementType());</span> |
| <span class="source-line-no">3963</span><span id="line-3963"> return getClassMeta(cm.innerClass);</span> |
| <span class="source-line-no">3964</span><span id="line-3964"> }</span> |
| <span class="source-line-no">3965</span><span id="line-3965"></span> |
| <span class="source-line-no">3966</span><span id="line-3966"> Class c = resolve(o, typeVarImpls);</span> |
| <span class="source-line-no">3967</span><span id="line-3967"></span> |
| <span class="source-line-no">3968</span><span id="line-3968"> // This can happen when trying to resolve the "E getFirst()" method on LinkedList, whose type is a TypeVariable</span> |
| <span class="source-line-no">3969</span><span id="line-3969"> // These should just resolve to Object.</span> |
| <span class="source-line-no">3970</span><span id="line-3970"> if (c == null)</span> |
| <span class="source-line-no">3971</span><span id="line-3971"> return object();</span> |
| <span class="source-line-no">3972</span><span id="line-3972"></span> |
| <span class="source-line-no">3973</span><span id="line-3973"> ClassMeta rawType = getClassMeta(c);</span> |
| <span class="source-line-no">3974</span><span id="line-3974"></span> |
| <span class="source-line-no">3975</span><span id="line-3975"> // If this is a Map or Collection, and the parameter types aren't part</span> |
| <span class="source-line-no">3976</span><span id="line-3976"> // of the class definition itself (e.g. class AddressBook extends List<Person>),</span> |
| <span class="source-line-no">3977</span><span id="line-3977"> // then we need to figure out the parameters.</span> |
| <span class="source-line-no">3978</span><span id="line-3978"> if (rawType.isMap() || rawType.isCollection() || rawType.isOptional()) {</span> |
| <span class="source-line-no">3979</span><span id="line-3979"> ClassMeta[] params = findParameters(o, c);</span> |
| <span class="source-line-no">3980</span><span id="line-3980"> if (params == null)</span> |
| <span class="source-line-no">3981</span><span id="line-3981"> return rawType;</span> |
| <span class="source-line-no">3982</span><span id="line-3982"> if (rawType.isMap()) {</span> |
| <span class="source-line-no">3983</span><span id="line-3983"> if (params.length != 2 || (params[0].isObject() && params[1].isObject()))</span> |
| <span class="source-line-no">3984</span><span id="line-3984"> return rawType;</span> |
| <span class="source-line-no">3985</span><span id="line-3985"> return new ClassMeta(rawType, params[0], params[1], null);</span> |
| <span class="source-line-no">3986</span><span id="line-3986"> }</span> |
| <span class="source-line-no">3987</span><span id="line-3987"> if (rawType.isCollection() || rawType.isOptional()) {</span> |
| <span class="source-line-no">3988</span><span id="line-3988"> if (params.length != 1 || params[0].isObject())</span> |
| <span class="source-line-no">3989</span><span id="line-3989"> return rawType;</span> |
| <span class="source-line-no">3990</span><span id="line-3990"> return new ClassMeta(rawType, null, null, params[0]);</span> |
| <span class="source-line-no">3991</span><span id="line-3991"> }</span> |
| <span class="source-line-no">3992</span><span id="line-3992"> }</span> |
| <span class="source-line-no">3993</span><span id="line-3993"></span> |
| <span class="source-line-no">3994</span><span id="line-3994"> if (rawType.isArray()) {</span> |
| <span class="source-line-no">3995</span><span id="line-3995"> if (o instanceof GenericArrayType) {</span> |
| <span class="source-line-no">3996</span><span id="line-3996"> GenericArrayType gat = (GenericArrayType)o;</span> |
| <span class="source-line-no">3997</span><span id="line-3997"> ClassMeta elementType = resolveClassMeta(gat.getGenericComponentType(), typeVarImpls);</span> |
| <span class="source-line-no">3998</span><span id="line-3998"> return new ClassMeta(rawType, null, null, elementType);</span> |
| <span class="source-line-no">3999</span><span id="line-3999"> }</span> |
| <span class="source-line-no">4000</span><span id="line-4000"> }</span> |
| <span class="source-line-no">4001</span><span id="line-4001"></span> |
| <span class="source-line-no">4002</span><span id="line-4002"> return rawType;</span> |
| <span class="source-line-no">4003</span><span id="line-4003"> }</span> |
| <span class="source-line-no">4004</span><span id="line-4004"></span> |
| <span class="source-line-no">4005</span><span id="line-4005"> /**</span> |
| <span class="source-line-no">4006</span><span id="line-4006"> * Convert a Type to a Class if possible.</span> |
| <span class="source-line-no">4007</span><span id="line-4007"> * Return null if not possible.</span> |
| <span class="source-line-no">4008</span><span id="line-4008"> */</span> |
| <span class="source-line-no">4009</span><span id="line-4009"> final Class resolve(Type t, Map<Class<?>,Class<?>[]> typeVarImpls) {</span> |
| <span class="source-line-no">4010</span><span id="line-4010"></span> |
| <span class="source-line-no">4011</span><span id="line-4011"> if (t instanceof Class)</span> |
| <span class="source-line-no">4012</span><span id="line-4012"> return (Class)t;</span> |
| <span class="source-line-no">4013</span><span id="line-4013"></span> |
| <span class="source-line-no">4014</span><span id="line-4014"> if (t instanceof ParameterizedType)</span> |
| <span class="source-line-no">4015</span><span id="line-4015"> // A parameter (e.g. <String>.</span> |
| <span class="source-line-no">4016</span><span id="line-4016"> return (Class)((ParameterizedType)t).getRawType();</span> |
| <span class="source-line-no">4017</span><span id="line-4017"></span> |
| <span class="source-line-no">4018</span><span id="line-4018"> if (t instanceof GenericArrayType) {</span> |
| <span class="source-line-no">4019</span><span id="line-4019"> // An array parameter (e.g. <byte[]>).</span> |
| <span class="source-line-no">4020</span><span id="line-4020"> Type gatct = ((GenericArrayType)t).getGenericComponentType();</span> |
| <span class="source-line-no">4021</span><span id="line-4021"></span> |
| <span class="source-line-no">4022</span><span id="line-4022"> if (gatct instanceof Class)</span> |
| <span class="source-line-no">4023</span><span id="line-4023"> return Array.newInstance((Class)gatct, 0).getClass();</span> |
| <span class="source-line-no">4024</span><span id="line-4024"></span> |
| <span class="source-line-no">4025</span><span id="line-4025"> if (gatct instanceof ParameterizedType)</span> |
| <span class="source-line-no">4026</span><span id="line-4026"> return Array.newInstance((Class)((ParameterizedType)gatct).getRawType(), 0).getClass();</span> |
| <span class="source-line-no">4027</span><span id="line-4027"></span> |
| <span class="source-line-no">4028</span><span id="line-4028"> if (gatct instanceof GenericArrayType)</span> |
| <span class="source-line-no">4029</span><span id="line-4029"> return Array.newInstance(resolve(gatct, typeVarImpls), 0).getClass();</span> |
| <span class="source-line-no">4030</span><span id="line-4030"></span> |
| <span class="source-line-no">4031</span><span id="line-4031"> return null;</span> |
| <span class="source-line-no">4032</span><span id="line-4032"></span> |
| <span class="source-line-no">4033</span><span id="line-4033"> } else if (t instanceof TypeVariable) {</span> |
| <span class="source-line-no">4034</span><span id="line-4034"> if (typeVarImpls != null) {</span> |
| <span class="source-line-no">4035</span><span id="line-4035"> TypeVariable tv = (TypeVariable)t;</span> |
| <span class="source-line-no">4036</span><span id="line-4036"> String varName = tv.getName();</span> |
| <span class="source-line-no">4037</span><span id="line-4037"> int varIndex = -1;</span> |
| <span class="source-line-no">4038</span><span id="line-4038"> Class gc = (Class)tv.getGenericDeclaration();</span> |
| <span class="source-line-no">4039</span><span id="line-4039"> TypeVariable[] tvv = gc.getTypeParameters();</span> |
| <span class="source-line-no">4040</span><span id="line-4040"> for (int i = 0; i < tvv.length; i++) {</span> |
| <span class="source-line-no">4041</span><span id="line-4041"> if (tvv[i].getName().equals(varName)) {</span> |
| <span class="source-line-no">4042</span><span id="line-4042"> varIndex = i;</span> |
| <span class="source-line-no">4043</span><span id="line-4043"> }</span> |
| <span class="source-line-no">4044</span><span id="line-4044"> }</span> |
| <span class="source-line-no">4045</span><span id="line-4045"> if (varIndex != -1) {</span> |
| <span class="source-line-no">4046</span><span id="line-4046"></span> |
| <span class="source-line-no">4047</span><span id="line-4047"> // If we couldn't find a type variable implementation, that means</span> |
| <span class="source-line-no">4048</span><span id="line-4048"> // the type was defined at runtime (e.g. Bean b = new Bean<Foo>();)</span> |
| <span class="source-line-no">4049</span><span id="line-4049"> // in which case the type is lost through erasure.</span> |
| <span class="source-line-no">4050</span><span id="line-4050"> // Assume java.lang.Object as the type.</span> |
| <span class="source-line-no">4051</span><span id="line-4051"> if (! typeVarImpls.containsKey(gc))</span> |
| <span class="source-line-no">4052</span><span id="line-4052"> return null;</span> |
| <span class="source-line-no">4053</span><span id="line-4053"></span> |
| <span class="source-line-no">4054</span><span id="line-4054"> return typeVarImpls.get(gc)[varIndex];</span> |
| <span class="source-line-no">4055</span><span id="line-4055"> }</span> |
| <span class="source-line-no">4056</span><span id="line-4056"> }</span> |
| <span class="source-line-no">4057</span><span id="line-4057"> }</span> |
| <span class="source-line-no">4058</span><span id="line-4058"> return null;</span> |
| <span class="source-line-no">4059</span><span id="line-4059"> }</span> |
| <span class="source-line-no">4060</span><span id="line-4060"></span> |
| <span class="source-line-no">4061</span><span id="line-4061"> final ClassMeta[] findParameters(Type o, Class c) {</span> |
| <span class="source-line-no">4062</span><span id="line-4062"> if (o == null)</span> |
| <span class="source-line-no">4063</span><span id="line-4063"> o = c;</span> |
| <span class="source-line-no">4064</span><span id="line-4064"></span> |
| <span class="source-line-no">4065</span><span id="line-4065"> // Loop until we find a ParameterizedType</span> |
| <span class="source-line-no">4066</span><span id="line-4066"> if (! (o instanceof ParameterizedType)) {</span> |
| <span class="source-line-no">4067</span><span id="line-4067"> loop: do {</span> |
| <span class="source-line-no">4068</span><span id="line-4068"> o = c.getGenericSuperclass();</span> |
| <span class="source-line-no">4069</span><span id="line-4069"> if (o instanceof ParameterizedType)</span> |
| <span class="source-line-no">4070</span><span id="line-4070"> break loop;</span> |
| <span class="source-line-no">4071</span><span id="line-4071"> for (Type t : c.getGenericInterfaces()) {</span> |
| <span class="source-line-no">4072</span><span id="line-4072"> o = t;</span> |
| <span class="source-line-no">4073</span><span id="line-4073"> if (o instanceof ParameterizedType)</span> |
| <span class="source-line-no">4074</span><span id="line-4074"> break loop;</span> |
| <span class="source-line-no">4075</span><span id="line-4075"> }</span> |
| <span class="source-line-no">4076</span><span id="line-4076"> c = c.getSuperclass();</span> |
| <span class="source-line-no">4077</span><span id="line-4077"> } while (c != null);</span> |
| <span class="source-line-no">4078</span><span id="line-4078"> }</span> |
| <span class="source-line-no">4079</span><span id="line-4079"></span> |
| <span class="source-line-no">4080</span><span id="line-4080"> if (o instanceof ParameterizedType) {</span> |
| <span class="source-line-no">4081</span><span id="line-4081"> ParameterizedType pt = (ParameterizedType)o;</span> |
| <span class="source-line-no">4082</span><span id="line-4082"> if (! pt.getRawType().equals(Enum.class)) {</span> |
| <span class="source-line-no">4083</span><span id="line-4083"> List<ClassMeta<?>> l = new LinkedList<>();</span> |
| <span class="source-line-no">4084</span><span id="line-4084"> for (Type pt2 : pt.getActualTypeArguments()) {</span> |
| <span class="source-line-no">4085</span><span id="line-4085"> if (pt2 instanceof WildcardType || pt2 instanceof TypeVariable)</span> |
| <span class="source-line-no">4086</span><span id="line-4086"> return null;</span> |
| <span class="source-line-no">4087</span><span id="line-4087"> l.add(resolveClassMeta(pt2, null));</span> |
| <span class="source-line-no">4088</span><span id="line-4088"> }</span> |
| <span class="source-line-no">4089</span><span id="line-4089"> if (l.isEmpty())</span> |
| <span class="source-line-no">4090</span><span id="line-4090"> return null;</span> |
| <span class="source-line-no">4091</span><span id="line-4091"> return l.toArray(new ClassMeta[l.size()]);</span> |
| <span class="source-line-no">4092</span><span id="line-4092"> }</span> |
| <span class="source-line-no">4093</span><span id="line-4093"> }</span> |
| <span class="source-line-no">4094</span><span id="line-4094"></span> |
| <span class="source-line-no">4095</span><span id="line-4095"> return null;</span> |
| <span class="source-line-no">4096</span><span id="line-4096"> }</span> |
| <span class="source-line-no">4097</span><span id="line-4097"></span> |
| <span class="source-line-no">4098</span><span id="line-4098"> /**</span> |
| <span class="source-line-no">4099</span><span id="line-4099"> * Shortcut for calling {@code getClassMeta(o.getClass())}.</span> |
| <span class="source-line-no">4100</span><span id="line-4100"> *</span> |
| <span class="source-line-no">4101</span><span id="line-4101"> * @param <T> The class of the object being passed in.</span> |
| <span class="source-line-no">4102</span><span id="line-4102"> * @param o The class to find the class type for.</span> |
| <span class="source-line-no">4103</span><span id="line-4103"> * @return The ClassMeta object, or <jk>null</jk> if {@code o} is <jk>null</jk>.</span> |
| <span class="source-line-no">4104</span><span id="line-4104"> */</span> |
| <span class="source-line-no">4105</span><span id="line-4105"> public final <T> ClassMeta<T> getClassMetaForObject(T o) {</span> |
| <span class="source-line-no">4106</span><span id="line-4106"> if (o == null)</span> |
| <span class="source-line-no">4107</span><span id="line-4107"> return null;</span> |
| <span class="source-line-no">4108</span><span id="line-4108"> return (ClassMeta<T>)getClassMeta(o.getClass());</span> |
| <span class="source-line-no">4109</span><span id="line-4109"> }</span> |
| <span class="source-line-no">4110</span><span id="line-4110"></span> |
| <span class="source-line-no">4111</span><span id="line-4111"></span> |
| <span class="source-line-no">4112</span><span id="line-4112"> /**</span> |
| <span class="source-line-no">4113</span><span id="line-4113"> * Used for determining the class type on a method or field where a {@code @Beanp} annotation may be present.</span> |
| <span class="source-line-no">4114</span><span id="line-4114"> *</span> |
| <span class="source-line-no">4115</span><span id="line-4115"> * @param <T> The class type we're wrapping.</span> |
| <span class="source-line-no">4116</span><span id="line-4116"> * @param p The property annotation on the type if there is one.</span> |
| <span class="source-line-no">4117</span><span id="line-4117"> * @param t The type.</span> |
| <span class="source-line-no">4118</span><span id="line-4118"> * @param typeVarImpls</span> |
| <span class="source-line-no">4119</span><span id="line-4119"> * Contains known resolved type parameters on the specified class so that we can result</span> |
| <span class="source-line-no">4120</span><span id="line-4120"> * {@code ParameterizedTypes} and {@code TypeVariables}.</span> |
| <span class="source-line-no">4121</span><span id="line-4121"> * Can be <jk>null</jk> if the information is not known.</span> |
| <span class="source-line-no">4122</span><span id="line-4122"> * @return The new {@code ClassMeta} object wrapped around the {@code Type} object.</span> |
| <span class="source-line-no">4123</span><span id="line-4123"> */</span> |
| <span class="source-line-no">4124</span><span id="line-4124"> protected final <T> ClassMeta<T> resolveClassMeta(Beanp p, Type t, Map<Class<?>,Class<?>[]> typeVarImpls) {</span> |
| <span class="source-line-no">4125</span><span id="line-4125"> ClassMeta<T> cm = resolveClassMeta(t, typeVarImpls);</span> |
| <span class="source-line-no">4126</span><span id="line-4126"> ClassMeta<T> cm2 = cm;</span> |
| <span class="source-line-no">4127</span><span id="line-4127"></span> |
| <span class="source-line-no">4128</span><span id="line-4128"> if (p != null) {</span> |
| <span class="source-line-no">4129</span><span id="line-4129"></span> |
| <span class="source-line-no">4130</span><span id="line-4130"> if (isNotVoid(p.type()))</span> |
| <span class="source-line-no">4131</span><span id="line-4131"> cm2 = resolveClassMeta(p.type(), typeVarImpls);</span> |
| <span class="source-line-no">4132</span><span id="line-4132"></span> |
| <span class="source-line-no">4133</span><span id="line-4133"> if (cm2.isMap()) {</span> |
| <span class="source-line-no">4134</span><span id="line-4134"> Class<?>[] pParams = (p.params().length == 0 ? new Class[]{Object.class, Object.class} : p.params());</span> |
| <span class="source-line-no">4135</span><span id="line-4135"> if (pParams.length != 2)</span> |
| <span class="source-line-no">4136</span><span id="line-4136"> throw new BasicRuntimeException("Invalid number of parameters specified for Map (must be 2): {0}", pParams.length);</span> |
| <span class="source-line-no">4137</span><span id="line-4137"> ClassMeta<?> keyType = resolveType(pParams[0], cm2.getKeyType(), cm.getKeyType());</span> |
| <span class="source-line-no">4138</span><span id="line-4138"> ClassMeta<?> valueType = resolveType(pParams[1], cm2.getValueType(), cm.getValueType());</span> |
| <span class="source-line-no">4139</span><span id="line-4139"> if (keyType.isObject() && valueType.isObject())</span> |
| <span class="source-line-no">4140</span><span id="line-4140"> return cm2;</span> |
| <span class="source-line-no">4141</span><span id="line-4141"> return new ClassMeta<>(cm2, keyType, valueType, null);</span> |
| <span class="source-line-no">4142</span><span id="line-4142"> }</span> |
| <span class="source-line-no">4143</span><span id="line-4143"></span> |
| <span class="source-line-no">4144</span><span id="line-4144"> if (cm2.isCollection() || cm2.isOptional()) {</span> |
| <span class="source-line-no">4145</span><span id="line-4145"> Class<?>[] pParams = (p.params().length == 0 ? new Class[]{Object.class} : p.params());</span> |
| <span class="source-line-no">4146</span><span id="line-4146"> if (pParams.length != 1)</span> |
| <span class="source-line-no">4147</span><span id="line-4147"> throw new BasicRuntimeException("Invalid number of parameters specified for {1} (must be 1): {0}", pParams.length, (cm2.isCollection() ? "Collection" : cm2.isOptional() ? "Optional" : "Array"));</span> |
| <span class="source-line-no">4148</span><span id="line-4148"> ClassMeta<?> elementType = resolveType(pParams[0], cm2.getElementType(), cm.getElementType());</span> |
| <span class="source-line-no">4149</span><span id="line-4149"> if (elementType.isObject())</span> |
| <span class="source-line-no">4150</span><span id="line-4150"> return cm2;</span> |
| <span class="source-line-no">4151</span><span id="line-4151"> return new ClassMeta<>(cm2, null, null, elementType);</span> |
| <span class="source-line-no">4152</span><span id="line-4152"> }</span> |
| <span class="source-line-no">4153</span><span id="line-4153"></span> |
| <span class="source-line-no">4154</span><span id="line-4154"> return cm2;</span> |
| <span class="source-line-no">4155</span><span id="line-4155"> }</span> |
| <span class="source-line-no">4156</span><span id="line-4156"></span> |
| <span class="source-line-no">4157</span><span id="line-4157"> return cm;</span> |
| <span class="source-line-no">4158</span><span id="line-4158"> }</span> |
| <span class="source-line-no">4159</span><span id="line-4159"></span> |
| <span class="source-line-no">4160</span><span id="line-4160"> private ClassMeta<?> resolveType(Type...t) {</span> |
| <span class="source-line-no">4161</span><span id="line-4161"> for (Type tt : t) {</span> |
| <span class="source-line-no">4162</span><span id="line-4162"> if (tt != null) {</span> |
| <span class="source-line-no">4163</span><span id="line-4163"> ClassMeta<?> cm = getClassMeta(tt);</span> |
| <span class="source-line-no">4164</span><span id="line-4164"> if (tt != cmObject)</span> |
| <span class="source-line-no">4165</span><span id="line-4165"> return cm;</span> |
| <span class="source-line-no">4166</span><span id="line-4166"> }</span> |
| <span class="source-line-no">4167</span><span id="line-4167"> }</span> |
| <span class="source-line-no">4168</span><span id="line-4168"> return cmObject;</span> |
| <span class="source-line-no">4169</span><span id="line-4169"> }</span> |
| <span class="source-line-no">4170</span><span id="line-4170"></span> |
| <span class="source-line-no">4171</span><span id="line-4171"> /**</span> |
| <span class="source-line-no">4172</span><span id="line-4172"> * Returns the {@link ObjectSwap} associated with the specified class, or <jk>null</jk> if there is no POJO swap</span> |
| <span class="source-line-no">4173</span><span id="line-4173"> * associated with the class.</span> |
| <span class="source-line-no">4174</span><span id="line-4174"> *</span> |
| <span class="source-line-no">4175</span><span id="line-4175"> * @param <T> The class associated with the swap.</span> |
| <span class="source-line-no">4176</span><span id="line-4176"> * @param c The class associated with the swap.</span> |
| <span class="source-line-no">4177</span><span id="line-4177"> * @return The swap associated with the class, or null if there is no association.</span> |
| <span class="source-line-no">4178</span><span id="line-4178"> */</span> |
| <span class="source-line-no">4179</span><span id="line-4179"> private final <T> ObjectSwap[] findObjectSwaps(Class<T> c) {</span> |
| <span class="source-line-no">4180</span><span id="line-4180"> // Note: On first</span> |
| <span class="source-line-no">4181</span><span id="line-4181"> if (c != null) {</span> |
| <span class="source-line-no">4182</span><span id="line-4182"> List<ObjectSwap> l = list();</span> |
| <span class="source-line-no">4183</span><span id="line-4183"> for (ObjectSwap f : swapArray)</span> |
| <span class="source-line-no">4184</span><span id="line-4184"> if (f.getNormalClass().isParentOf(c))</span> |
| <span class="source-line-no">4185</span><span id="line-4185"> l.add(f);</span> |
| <span class="source-line-no">4186</span><span id="line-4186"> return l.size() == 0 ? null : l.toArray(new ObjectSwap[l.size()]);</span> |
| <span class="source-line-no">4187</span><span id="line-4187"> }</span> |
| <span class="source-line-no">4188</span><span id="line-4188"> return null;</span> |
| <span class="source-line-no">4189</span><span id="line-4189"> }</span> |
| <span class="source-line-no">4190</span><span id="line-4190"></span> |
| <span class="source-line-no">4191</span><span id="line-4191"> /**</span> |
| <span class="source-line-no">4192</span><span id="line-4192"> * Checks whether a class has a {@link ObjectSwap} associated with it in this bean context.</span> |
| <span class="source-line-no">4193</span><span id="line-4193"> *</span> |
| <span class="source-line-no">4194</span><span id="line-4194"> * @param c The class to check.</span> |
| <span class="source-line-no">4195</span><span id="line-4195"> * @return <jk>true</jk> if the specified class or one of its subclasses has a {@link ObjectSwap} associated with it.</span> |
| <span class="source-line-no">4196</span><span id="line-4196"> */</span> |
| <span class="source-line-no">4197</span><span id="line-4197"> private final ObjectSwap[] findChildObjectSwaps(Class<?> c) {</span> |
| <span class="source-line-no">4198</span><span id="line-4198"> if (c == null || swapArray.length == 0)</span> |
| <span class="source-line-no">4199</span><span id="line-4199"> return null;</span> |
| <span class="source-line-no">4200</span><span id="line-4200"> List<ObjectSwap> l = null;</span> |
| <span class="source-line-no">4201</span><span id="line-4201"> for (ObjectSwap f : swapArray) {</span> |
| <span class="source-line-no">4202</span><span id="line-4202"> if (f.getNormalClass().isChildOf(c)) {</span> |
| <span class="source-line-no">4203</span><span id="line-4203"> if (l == null)</span> |
| <span class="source-line-no">4204</span><span id="line-4204"> l = list();</span> |
| <span class="source-line-no">4205</span><span id="line-4205"> l.add(f);</span> |
| <span class="source-line-no">4206</span><span id="line-4206"> }</span> |
| <span class="source-line-no">4207</span><span id="line-4207"> }</span> |
| <span class="source-line-no">4208</span><span id="line-4208"> return l == null ? null : l.toArray(new ObjectSwap[l.size()]);</span> |
| <span class="source-line-no">4209</span><span id="line-4209"> }</span> |
| <span class="source-line-no">4210</span><span id="line-4210"></span> |
| <span class="source-line-no">4211</span><span id="line-4211"> /**</span> |
| <span class="source-line-no">4212</span><span id="line-4212"> * Returns a reusable {@link ClassMeta} representation for the class <c>Object</c>.</span> |
| <span class="source-line-no">4213</span><span id="line-4213"> *</span> |
| <span class="source-line-no">4214</span><span id="line-4214"> * <p></span> |
| <span class="source-line-no">4215</span><span id="line-4215"> * This <c>ClassMeta</c> is often used to represent "any object type" when an object type is not known.</span> |
| <span class="source-line-no">4216</span><span id="line-4216"> *</span> |
| <span class="source-line-no">4217</span><span id="line-4217"> * <p></span> |
| <span class="source-line-no">4218</span><span id="line-4218"> * This method is identical to calling <code>getClassMeta(Object.<jk>class</jk>)</code> but uses a cached copy to</span> |
| <span class="source-line-no">4219</span><span id="line-4219"> * avoid a hashmap lookup.</span> |
| <span class="source-line-no">4220</span><span id="line-4220"> *</span> |
| <span class="source-line-no">4221</span><span id="line-4221"> * @return The {@link ClassMeta} object associated with the <c>Object</c> class.</span> |
| <span class="source-line-no">4222</span><span id="line-4222"> */</span> |
| <span class="source-line-no">4223</span><span id="line-4223"> protected final ClassMeta<Object> object() {</span> |
| <span class="source-line-no">4224</span><span id="line-4224"> return cmObject;</span> |
| <span class="source-line-no">4225</span><span id="line-4225"> }</span> |
| <span class="source-line-no">4226</span><span id="line-4226"></span> |
| <span class="source-line-no">4227</span><span id="line-4227"> /**</span> |
| <span class="source-line-no">4228</span><span id="line-4228"> * Returns a reusable {@link ClassMeta} representation for the class <c>String</c>.</span> |
| <span class="source-line-no">4229</span><span id="line-4229"> *</span> |
| <span class="source-line-no">4230</span><span id="line-4230"> * <p></span> |
| <span class="source-line-no">4231</span><span id="line-4231"> * This <c>ClassMeta</c> is often used to represent key types in maps.</span> |
| <span class="source-line-no">4232</span><span id="line-4232"> *</span> |
| <span class="source-line-no">4233</span><span id="line-4233"> * <p></span> |
| <span class="source-line-no">4234</span><span id="line-4234"> * This method is identical to calling <code>getClassMeta(String.<jk>class</jk>)</code> but uses a cached copy to</span> |
| <span class="source-line-no">4235</span><span id="line-4235"> * avoid a hashmap lookup.</span> |
| <span class="source-line-no">4236</span><span id="line-4236"> *</span> |
| <span class="source-line-no">4237</span><span id="line-4237"> * @return The {@link ClassMeta} object associated with the <c>String</c> class.</span> |
| <span class="source-line-no">4238</span><span id="line-4238"> */</span> |
| <span class="source-line-no">4239</span><span id="line-4239"> protected final ClassMeta<String> string() {</span> |
| <span class="source-line-no">4240</span><span id="line-4240"> return cmString;</span> |
| <span class="source-line-no">4241</span><span id="line-4241"> }</span> |
| <span class="source-line-no">4242</span><span id="line-4242"></span> |
| <span class="source-line-no">4243</span><span id="line-4243"> /**</span> |
| <span class="source-line-no">4244</span><span id="line-4244"> * Returns a reusable {@link ClassMeta} representation for the class <c>Class</c>.</span> |
| <span class="source-line-no">4245</span><span id="line-4245"> *</span> |
| <span class="source-line-no">4246</span><span id="line-4246"> * <p></span> |
| <span class="source-line-no">4247</span><span id="line-4247"> * This <c>ClassMeta</c> is often used to represent key types in maps.</span> |
| <span class="source-line-no">4248</span><span id="line-4248"> *</span> |
| <span class="source-line-no">4249</span><span id="line-4249"> * <p></span> |
| <span class="source-line-no">4250</span><span id="line-4250"> * This method is identical to calling <code>getClassMeta(Class.<jk>class</jk>)</code> but uses a cached copy to</span> |
| <span class="source-line-no">4251</span><span id="line-4251"> * avoid a hashmap lookup.</span> |
| <span class="source-line-no">4252</span><span id="line-4252"> *</span> |
| <span class="source-line-no">4253</span><span id="line-4253"> * @return The {@link ClassMeta} object associated with the <c>String</c> class.</span> |
| <span class="source-line-no">4254</span><span id="line-4254"> */</span> |
| <span class="source-line-no">4255</span><span id="line-4255"> protected final ClassMeta<Class> _class() {</span> |
| <span class="source-line-no">4256</span><span id="line-4256"> return cmClass;</span> |
| <span class="source-line-no">4257</span><span id="line-4257"> }</span> |
| <span class="source-line-no">4258</span><span id="line-4258"></span> |
| <span class="source-line-no">4259</span><span id="line-4259"> /**</span> |
| <span class="source-line-no">4260</span><span id="line-4260"> * Returns the lookup table for resolving bean types by name.</span> |
| <span class="source-line-no">4261</span><span id="line-4261"> *</span> |
| <span class="source-line-no">4262</span><span id="line-4262"> * @return The lookup table for resolving bean types by name.</span> |
| <span class="source-line-no">4263</span><span id="line-4263"> */</span> |
| <span class="source-line-no">4264</span><span id="line-4264"> protected final BeanRegistry getBeanRegistry() {</span> |
| <span class="source-line-no">4265</span><span id="line-4265"> return beanRegistry;</span> |
| <span class="source-line-no">4266</span><span id="line-4266"> }</span> |
| <span class="source-line-no">4267</span><span id="line-4267"></span> |
| <span class="source-line-no">4268</span><span id="line-4268"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">4269</span><span id="line-4269"> // Properties</span> |
| <span class="source-line-no">4270</span><span id="line-4270"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">4271</span><span id="line-4271"></span> |
| <span class="source-line-no">4272</span><span id="line-4272"> /**</span> |
| <span class="source-line-no">4273</span><span id="line-4273"> * Minimum bean class visibility.</span> |
| <span class="source-line-no">4274</span><span id="line-4274"> *</span> |
| <span class="source-line-no">4275</span><span id="line-4275"> * @see BeanContext.Builder#beanClassVisibility(Visibility)</span> |
| <span class="source-line-no">4276</span><span id="line-4276"> * @return</span> |
| <span class="source-line-no">4277</span><span id="line-4277"> * Classes are not considered beans unless they meet the minimum visibility requirements.</span> |
| <span class="source-line-no">4278</span><span id="line-4278"> */</span> |
| <span class="source-line-no">4279</span><span id="line-4279"> public final Visibility getBeanClassVisibility() {</span> |
| <span class="source-line-no">4280</span><span id="line-4280"> return beanClassVisibility;</span> |
| <span class="source-line-no">4281</span><span id="line-4281"> }</span> |
| <span class="source-line-no">4282</span><span id="line-4282"></span> |
| <span class="source-line-no">4283</span><span id="line-4283"> /**</span> |
| <span class="source-line-no">4284</span><span id="line-4284"> * Minimum bean constructor visibility.</span> |
| <span class="source-line-no">4285</span><span id="line-4285"> *</span> |
| <span class="source-line-no">4286</span><span id="line-4286"> * @see BeanContext.Builder#beanConstructorVisibility(Visibility)</span> |
| <span class="source-line-no">4287</span><span id="line-4287"> * @return</span> |
| <span class="source-line-no">4288</span><span id="line-4288"> * Only look for constructors with this specified minimum visibility.</span> |
| <span class="source-line-no">4289</span><span id="line-4289"> */</span> |
| <span class="source-line-no">4290</span><span id="line-4290"> public final Visibility getBeanConstructorVisibility() {</span> |
| <span class="source-line-no">4291</span><span id="line-4291"> return beanConstructorVisibility;</span> |
| <span class="source-line-no">4292</span><span id="line-4292"> }</span> |
| <span class="source-line-no">4293</span><span id="line-4293"></span> |
| <span class="source-line-no">4294</span><span id="line-4294"> /**</span> |
| <span class="source-line-no">4295</span><span id="line-4295"> * Bean dictionary.</span> |
| <span class="source-line-no">4296</span><span id="line-4296"> *</span> |
| <span class="source-line-no">4297</span><span id="line-4297"> * @see BeanContext.Builder#beanDictionary()</span> |
| <span class="source-line-no">4298</span><span id="line-4298"> * @return</span> |
| <span class="source-line-no">4299</span><span id="line-4299"> * The list of classes that make up the bean dictionary in this bean context.</span> |
| <span class="source-line-no">4300</span><span id="line-4300"> */</span> |
| <span class="source-line-no">4301</span><span id="line-4301"> public final List<Class<?>> getBeanDictionary() {</span> |
| <span class="source-line-no">4302</span><span id="line-4302"> return beanDictionary;</span> |
| <span class="source-line-no">4303</span><span id="line-4303"> }</span> |
| <span class="source-line-no">4304</span><span id="line-4304"></span> |
| <span class="source-line-no">4305</span><span id="line-4305"> /**</span> |
| <span class="source-line-no">4306</span><span id="line-4306"> * Minimum bean field visibility.</span> |
| <span class="source-line-no">4307</span><span id="line-4307"> *</span> |
| <span class="source-line-no">4308</span><span id="line-4308"> *</span> |
| <span class="source-line-no">4309</span><span id="line-4309"> * @see BeanContext.Builder#beanFieldVisibility(Visibility)</span> |
| <span class="source-line-no">4310</span><span id="line-4310"> * @return</span> |
| <span class="source-line-no">4311</span><span id="line-4311"> * Only look for bean fields with this specified minimum visibility.</span> |
| <span class="source-line-no">4312</span><span id="line-4312"> */</span> |
| <span class="source-line-no">4313</span><span id="line-4313"> public final Visibility getBeanFieldVisibility() {</span> |
| <span class="source-line-no">4314</span><span id="line-4314"> return beanFieldVisibility;</span> |
| <span class="source-line-no">4315</span><span id="line-4315"> }</span> |
| <span class="source-line-no">4316</span><span id="line-4316"></span> |
| <span class="source-line-no">4317</span><span id="line-4317"> /**</span> |
| <span class="source-line-no">4318</span><span id="line-4318"> * BeanMap.put() returns old property value.</span> |
| <span class="source-line-no">4319</span><span id="line-4319"> *</span> |
| <span class="source-line-no">4320</span><span id="line-4320"> * @see BeanContext.Builder#beanMapPutReturnsOldValue()</span> |
| <span class="source-line-no">4321</span><span id="line-4321"> * @return</span> |
| <span class="source-line-no">4322</span><span id="line-4322"> * <jk>true</jk> if the {@link BeanMap#put(String,Object) BeanMap.put()} method will return old property values.</span> |
| <span class="source-line-no">4323</span><span id="line-4323"> * <br>Otherwise, it returns <jk>null</jk>.</span> |
| <span class="source-line-no">4324</span><span id="line-4324"> */</span> |
| <span class="source-line-no">4325</span><span id="line-4325"> public final boolean isBeanMapPutReturnsOldValue() {</span> |
| <span class="source-line-no">4326</span><span id="line-4326"> return beanMapPutReturnsOldValue;</span> |
| <span class="source-line-no">4327</span><span id="line-4327"> }</span> |
| <span class="source-line-no">4328</span><span id="line-4328"></span> |
| <span class="source-line-no">4329</span><span id="line-4329"> /**</span> |
| <span class="source-line-no">4330</span><span id="line-4330"> * Minimum bean method visibility.</span> |
| <span class="source-line-no">4331</span><span id="line-4331"> *</span> |
| <span class="source-line-no">4332</span><span id="line-4332"> * @see BeanContext.Builder#beanMethodVisibility(Visibility)</span> |
| <span class="source-line-no">4333</span><span id="line-4333"> * @return</span> |
| <span class="source-line-no">4334</span><span id="line-4334"> * Only look for bean methods with this specified minimum visibility.</span> |
| <span class="source-line-no">4335</span><span id="line-4335"> */</span> |
| <span class="source-line-no">4336</span><span id="line-4336"> public final Visibility getBeanMethodVisibility() {</span> |
| <span class="source-line-no">4337</span><span id="line-4337"> return beanMethodVisibility;</span> |
| <span class="source-line-no">4338</span><span id="line-4338"> }</span> |
| <span class="source-line-no">4339</span><span id="line-4339"></span> |
| <span class="source-line-no">4340</span><span id="line-4340"> /**</span> |
| <span class="source-line-no">4341</span><span id="line-4341"> * Beans require no-arg constructors.</span> |
| <span class="source-line-no">4342</span><span id="line-4342"> *</span> |
| <span class="source-line-no">4343</span><span id="line-4343"> * @see BeanContext.Builder#beansRequireDefaultConstructor()</span> |
| <span class="source-line-no">4344</span><span id="line-4344"> * @return</span> |
| <span class="source-line-no">4345</span><span id="line-4345"> * <jk>true</jk> if a Java class must implement a default no-arg constructor to be considered a bean.</span> |
| <span class="source-line-no">4346</span><span id="line-4346"> * <br>Otherwise, the bean will be serialized as a string using the {@link Object#toString()} method.</span> |
| <span class="source-line-no">4347</span><span id="line-4347"> */</span> |
| <span class="source-line-no">4348</span><span id="line-4348"> public final boolean isBeansRequireDefaultConstructor() {</span> |
| <span class="source-line-no">4349</span><span id="line-4349"> return beansRequireDefaultConstructor;</span> |
| <span class="source-line-no">4350</span><span id="line-4350"> }</span> |
| <span class="source-line-no">4351</span><span id="line-4351"></span> |
| <span class="source-line-no">4352</span><span id="line-4352"> /**</span> |
| <span class="source-line-no">4353</span><span id="line-4353"> * Beans require Serializable interface.</span> |
| <span class="source-line-no">4354</span><span id="line-4354"> *</span> |
| <span class="source-line-no">4355</span><span id="line-4355"> * @see BeanContext.Builder#beansRequireSerializable()</span> |
| <span class="source-line-no">4356</span><span id="line-4356"> * @return</span> |
| <span class="source-line-no">4357</span><span id="line-4357"> * <jk>true</jk> if a Java class must implement the {@link Serializable} interface to be considered a bean.</span> |
| <span class="source-line-no">4358</span><span id="line-4358"> * <br>Otherwise, the bean will be serialized as a string using the {@link Object#toString()} method.</span> |
| <span class="source-line-no">4359</span><span id="line-4359"> */</span> |
| <span class="source-line-no">4360</span><span id="line-4360"> public final boolean isBeansRequireSerializable() {</span> |
| <span class="source-line-no">4361</span><span id="line-4361"> return beansRequireSerializable;</span> |
| <span class="source-line-no">4362</span><span id="line-4362"> }</span> |
| <span class="source-line-no">4363</span><span id="line-4363"></span> |
| <span class="source-line-no">4364</span><span id="line-4364"> /**</span> |
| <span class="source-line-no">4365</span><span id="line-4365"> * Beans require setters for getters.</span> |
| <span class="source-line-no">4366</span><span id="line-4366"> *</span> |
| <span class="source-line-no">4367</span><span id="line-4367"> * @see BeanContext.Builder#beansRequireSettersForGetters()</span> |
| <span class="source-line-no">4368</span><span id="line-4368"> * @return</span> |
| <span class="source-line-no">4369</span><span id="line-4369"> * <jk>true</jk> if only getters that have equivalent setters will be considered as properties on a bean.</span> |
| <span class="source-line-no">4370</span><span id="line-4370"> * <br>Otherwise, they are ignored.</span> |
| <span class="source-line-no">4371</span><span id="line-4371"> */</span> |
| <span class="source-line-no">4372</span><span id="line-4372"> public final boolean isBeansRequireSettersForGetters() {</span> |
| <span class="source-line-no">4373</span><span id="line-4373"> return beansRequireSettersForGetters;</span> |
| <span class="source-line-no">4374</span><span id="line-4374"> }</span> |
| <span class="source-line-no">4375</span><span id="line-4375"></span> |
| <span class="source-line-no">4376</span><span id="line-4376"> /**</span> |
| <span class="source-line-no">4377</span><span id="line-4377"> * Beans require at least one property.</span> |
| <span class="source-line-no">4378</span><span id="line-4378"> *</span> |
| <span class="source-line-no">4379</span><span id="line-4379"> * @see BeanContext.Builder#disableBeansRequireSomeProperties()</span> |
| <span class="source-line-no">4380</span><span id="line-4380"> * @return</span> |
| <span class="source-line-no">4381</span><span id="line-4381"> * <jk>true</jk> if a Java class doesn't need to contain at least 1 property to be considered a bean.</span> |
| <span class="source-line-no">4382</span><span id="line-4382"> * <br>Otherwise, the bean is serialized as a string using the {@link Object#toString()} method.</span> |
| <span class="source-line-no">4383</span><span id="line-4383"> */</span> |
| <span class="source-line-no">4384</span><span id="line-4384"> public final boolean isBeansRequireSomeProperties() {</span> |
| <span class="source-line-no">4385</span><span id="line-4385"> return beansRequireSomeProperties;</span> |
| <span class="source-line-no">4386</span><span id="line-4386"> }</span> |
| <span class="source-line-no">4387</span><span id="line-4387"></span> |
| <span class="source-line-no">4388</span><span id="line-4388"> /**</span> |
| <span class="source-line-no">4389</span><span id="line-4389"> * Bean type property name.</span> |
| <span class="source-line-no">4390</span><span id="line-4390"> *</span> |
| <span class="source-line-no">4391</span><span id="line-4391"> * @see BeanContext.Builder#typePropertyName(String)</span> |
| <span class="source-line-no">4392</span><span id="line-4392"> * @return</span> |
| <span class="source-line-no">4393</span><span id="line-4393"> * The name of the bean property used to store the dictionary name of a bean type so that the parser knows the data type to reconstruct.</span> |
| <span class="source-line-no">4394</span><span id="line-4394"> */</span> |
| <span class="source-line-no">4395</span><span id="line-4395"> public final String getBeanTypePropertyName() {</span> |
| <span class="source-line-no">4396</span><span id="line-4396"> return typePropertyName;</span> |
| <span class="source-line-no">4397</span><span id="line-4397"> }</span> |
| <span class="source-line-no">4398</span><span id="line-4398"></span> |
| <span class="source-line-no">4399</span><span id="line-4399"> /**</span> |
| <span class="source-line-no">4400</span><span id="line-4400"> * Find fluent setters.</span> |
| <span class="source-line-no">4401</span><span id="line-4401"> *</span> |
| <span class="source-line-no">4402</span><span id="line-4402"> * <h5 class='section'>Description:</h5></span> |
| <span class="source-line-no">4403</span><span id="line-4403"> * <p></span> |
| <span class="source-line-no">4404</span><span id="line-4404"> *</span> |
| <span class="source-line-no">4405</span><span id="line-4405"> * @see BeanContext.Builder#findFluentSetters()</span> |
| <span class="source-line-no">4406</span><span id="line-4406"> * @return</span> |
| <span class="source-line-no">4407</span><span id="line-4407"> * <jk>true</jk> if fluent setters are detected on beans.</span> |
| <span class="source-line-no">4408</span><span id="line-4408"> */</span> |
| <span class="source-line-no">4409</span><span id="line-4409"> public final boolean isFindFluentSetters() {</span> |
| <span class="source-line-no">4410</span><span id="line-4410"> return findFluentSetters;</span> |
| <span class="source-line-no">4411</span><span id="line-4411"> }</span> |
| <span class="source-line-no">4412</span><span id="line-4412"></span> |
| <span class="source-line-no">4413</span><span id="line-4413"> /**</span> |
| <span class="source-line-no">4414</span><span id="line-4414"> * Ignore invocation errors on getters.</span> |
| <span class="source-line-no">4415</span><span id="line-4415"> *</span> |
| <span class="source-line-no">4416</span><span id="line-4416"> * @see BeanContext.Builder#ignoreInvocationExceptionsOnGetters()</span> |
| <span class="source-line-no">4417</span><span id="line-4417"> * @return</span> |
| <span class="source-line-no">4418</span><span id="line-4418"> * <jk>true</jk> if errors thrown when calling bean getter methods are silently ignored.</span> |
| <span class="source-line-no">4419</span><span id="line-4419"> */</span> |
| <span class="source-line-no">4420</span><span id="line-4420"> public final boolean isIgnoreInvocationExceptionsOnGetters() {</span> |
| <span class="source-line-no">4421</span><span id="line-4421"> return ignoreInvocationExceptionsOnGetters;</span> |
| <span class="source-line-no">4422</span><span id="line-4422"> }</span> |
| <span class="source-line-no">4423</span><span id="line-4423"></span> |
| <span class="source-line-no">4424</span><span id="line-4424"> /**</span> |
| <span class="source-line-no">4425</span><span id="line-4425"> * Ignore invocation errors on setters.</span> |
| <span class="source-line-no">4426</span><span id="line-4426"> *</span> |
| <span class="source-line-no">4427</span><span id="line-4427"> * @see BeanContext.Builder#ignoreInvocationExceptionsOnSetters()</span> |
| <span class="source-line-no">4428</span><span id="line-4428"> * @return</span> |
| <span class="source-line-no">4429</span><span id="line-4429"> * <jk>true</jk> if errors thrown when calling bean setter methods are silently ignored.</span> |
| <span class="source-line-no">4430</span><span id="line-4430"> */</span> |
| <span class="source-line-no">4431</span><span id="line-4431"> public final boolean isIgnoreInvocationExceptionsOnSetters() {</span> |
| <span class="source-line-no">4432</span><span id="line-4432"> return ignoreInvocationExceptionsOnSetters;</span> |
| <span class="source-line-no">4433</span><span id="line-4433"> }</span> |
| <span class="source-line-no">4434</span><span id="line-4434"></span> |
| <span class="source-line-no">4435</span><span id="line-4435"> /**</span> |
| <span class="source-line-no">4436</span><span id="line-4436"> * Silently ignore missing setters.</span> |
| <span class="source-line-no">4437</span><span id="line-4437"> *</span> |
| <span class="source-line-no">4438</span><span id="line-4438"> * @see BeanContext.Builder#disableIgnoreMissingSetters()</span> |
| <span class="source-line-no">4439</span><span id="line-4439"> * @return</span> |
| <span class="source-line-no">4440</span><span id="line-4440"> * <jk>true</jk> if trying to set a value on a bean property without a setter should throw a {@link BeanRuntimeException}.</span> |
| <span class="source-line-no">4441</span><span id="line-4441"> */</span> |
| <span class="source-line-no">4442</span><span id="line-4442"> public final boolean isIgnoreMissingSetters() {</span> |
| <span class="source-line-no">4443</span><span id="line-4443"> return ignoreMissingSetters;</span> |
| <span class="source-line-no">4444</span><span id="line-4444"> }</span> |
| <span class="source-line-no">4445</span><span id="line-4445"></span> |
| <span class="source-line-no">4446</span><span id="line-4446"> /**</span> |
| <span class="source-line-no">4447</span><span id="line-4447"> * Ignore transient fields.</span> |
| <span class="source-line-no">4448</span><span id="line-4448"> *</span> |
| <span class="source-line-no">4449</span><span id="line-4449"> * @see BeanContext.Builder#disableIgnoreTransientFields()</span> |
| <span class="source-line-no">4450</span><span id="line-4450"> * @return</span> |
| <span class="source-line-no">4451</span><span id="line-4451"> * <jk>true</jk> if fields and methods marked as transient should not be ignored.</span> |
| <span class="source-line-no">4452</span><span id="line-4452"> */</span> |
| <span class="source-line-no">4453</span><span id="line-4453"> protected final boolean isIgnoreTransientFields() {</span> |
| <span class="source-line-no">4454</span><span id="line-4454"> return ignoreTransientFields;</span> |
| <span class="source-line-no">4455</span><span id="line-4455"> }</span> |
| <span class="source-line-no">4456</span><span id="line-4456"></span> |
| <span class="source-line-no">4457</span><span id="line-4457"> /**</span> |
| <span class="source-line-no">4458</span><span id="line-4458"> * Ignore unknown properties.</span> |
| <span class="source-line-no">4459</span><span id="line-4459"> *</span> |
| <span class="source-line-no">4460</span><span id="line-4460"> * @see BeanContext.Builder#ignoreUnknownBeanProperties()</span> |
| <span class="source-line-no">4461</span><span id="line-4461"> * @return</span> |
| <span class="source-line-no">4462</span><span id="line-4462"> * <jk>true</jk> if trying to set a value on a non-existent bean property is silently ignored.</span> |
| <span class="source-line-no">4463</span><span id="line-4463"> * <br>Otherwise, a {@code RuntimeException} is thrown.</span> |
| <span class="source-line-no">4464</span><span id="line-4464"> */</span> |
| <span class="source-line-no">4465</span><span id="line-4465"> public final boolean isIgnoreUnknownBeanProperties() {</span> |
| <span class="source-line-no">4466</span><span id="line-4466"> return ignoreUnknownBeanProperties;</span> |
| <span class="source-line-no">4467</span><span id="line-4467"> }</span> |
| <span class="source-line-no">4468</span><span id="line-4468"></span> |
| <span class="source-line-no">4469</span><span id="line-4469"> /**</span> |
| <span class="source-line-no">4470</span><span id="line-4470"> * Ignore unknown enum values.</span> |
| <span class="source-line-no">4471</span><span id="line-4471"> *</span> |
| <span class="source-line-no">4472</span><span id="line-4472"> * @see BeanContext.Builder#ignoreUnknownEnumValues()</span> |
| <span class="source-line-no">4473</span><span id="line-4473"> * @return</span> |
| <span class="source-line-no">4474</span><span id="line-4474"> * <jk>true</jk> if unknown enum values should be set as <jk>null</jk> instead of throwing an exception.</span> |
| <span class="source-line-no">4475</span><span id="line-4475"> */</span> |
| <span class="source-line-no">4476</span><span id="line-4476"> public final boolean isIgnoreUnknownEnumValues() {</span> |
| <span class="source-line-no">4477</span><span id="line-4477"> return ignoreUnknownEnumValues;</span> |
| <span class="source-line-no">4478</span><span id="line-4478"> }</span> |
| <span class="source-line-no">4479</span><span id="line-4479"></span> |
| <span class="source-line-no">4480</span><span id="line-4480"> /**</span> |
| <span class="source-line-no">4481</span><span id="line-4481"> * Ignore unknown properties with null values.</span> |
| <span class="source-line-no">4482</span><span id="line-4482"> *</span> |
| <span class="source-line-no">4483</span><span id="line-4483"> * @see BeanContext.Builder#disableIgnoreUnknownNullBeanProperties()</span> |
| <span class="source-line-no">4484</span><span id="line-4484"> * @return</span> |
| <span class="source-line-no">4485</span><span id="line-4485"> * <jk>true</jk> if trying to set a <jk>null</jk> value on a non-existent bean property should throw a {@link BeanRuntimeException}.</span> |
| <span class="source-line-no">4486</span><span id="line-4486"> */</span> |
| <span class="source-line-no">4487</span><span id="line-4487"> public final boolean isIgnoreUnknownNullBeanProperties() {</span> |
| <span class="source-line-no">4488</span><span id="line-4488"> return ignoreUnknownNullBeanProperties;</span> |
| <span class="source-line-no">4489</span><span id="line-4489"> }</span> |
| <span class="source-line-no">4490</span><span id="line-4490"></span> |
| <span class="source-line-no">4491</span><span id="line-4491"> /**</span> |
| <span class="source-line-no">4492</span><span id="line-4492"> * Bean class exclusions.</span> |
| <span class="source-line-no">4493</span><span id="line-4493"> *</span> |
| <span class="source-line-no">4494</span><span id="line-4494"> * @see BeanContext.Builder#notBeanClasses(Class...)</span> |
| <span class="source-line-no">4495</span><span id="line-4495"> * @return</span> |
| <span class="source-line-no">4496</span><span id="line-4496"> * The list of classes that are explicitly not beans.</span> |
| <span class="source-line-no">4497</span><span id="line-4497"> */</span> |
| <span class="source-line-no">4498</span><span id="line-4498"> protected final Class<?>[] getNotBeanClasses() {</span> |
| <span class="source-line-no">4499</span><span id="line-4499"> return notBeanClassesArray;</span> |
| <span class="source-line-no">4500</span><span id="line-4500"> }</span> |
| <span class="source-line-no">4501</span><span id="line-4501"></span> |
| <span class="source-line-no">4502</span><span id="line-4502"> /**</span> |
| <span class="source-line-no">4503</span><span id="line-4503"> * Bean package exclusions.</span> |
| <span class="source-line-no">4504</span><span id="line-4504"> *</span> |
| <span class="source-line-no">4505</span><span id="line-4505"> * @see BeanContext.Builder#notBeanPackages(String...)</span> |
| <span class="source-line-no">4506</span><span id="line-4506"> * @return</span> |
| <span class="source-line-no">4507</span><span id="line-4507"> * The list of fully-qualified package names to exclude from being classified as beans.</span> |
| <span class="source-line-no">4508</span><span id="line-4508"> */</span> |
| <span class="source-line-no">4509</span><span id="line-4509"> public final String[] getNotBeanPackagesNames() {</span> |
| <span class="source-line-no">4510</span><span id="line-4510"> return notBeanPackageNames;</span> |
| <span class="source-line-no">4511</span><span id="line-4511"> }</span> |
| <span class="source-line-no">4512</span><span id="line-4512"></span> |
| <span class="source-line-no">4513</span><span id="line-4513"> /**</span> |
| <span class="source-line-no">4514</span><span id="line-4514"> * Bean package exclusions.</span> |
| <span class="source-line-no">4515</span><span id="line-4515"> *</span> |
| <span class="source-line-no">4516</span><span id="line-4516"> * @see BeanContext.Builder#notBeanPackages(String...)</span> |
| <span class="source-line-no">4517</span><span id="line-4517"> * @return</span> |
| <span class="source-line-no">4518</span><span id="line-4518"> * The list of package name prefixes to exclude from being classified as beans.</span> |
| <span class="source-line-no">4519</span><span id="line-4519"> */</span> |
| <span class="source-line-no">4520</span><span id="line-4520"> protected final String[] getNotBeanPackagesPrefixes() {</span> |
| <span class="source-line-no">4521</span><span id="line-4521"> return notBeanPackagePrefixes;</span> |
| <span class="source-line-no">4522</span><span id="line-4522"> }</span> |
| <span class="source-line-no">4523</span><span id="line-4523"></span> |
| <span class="source-line-no">4524</span><span id="line-4524"> /**</span> |
| <span class="source-line-no">4525</span><span id="line-4525"> * Java object swaps.</span> |
| <span class="source-line-no">4526</span><span id="line-4526"> *</span> |
| <span class="source-line-no">4527</span><span id="line-4527"> * @see BeanContext.Builder#swaps(Class...)</span> |
| <span class="source-line-no">4528</span><span id="line-4528"> * @return</span> |
| <span class="source-line-no">4529</span><span id="line-4529"> * The list POJO swaps defined.</span> |
| <span class="source-line-no">4530</span><span id="line-4530"> */</span> |
| <span class="source-line-no">4531</span><span id="line-4531"> public final ObjectSwap<?,?>[] getSwaps() {</span> |
| <span class="source-line-no">4532</span><span id="line-4532"> return swapArray;</span> |
| <span class="source-line-no">4533</span><span id="line-4533"> }</span> |
| <span class="source-line-no">4534</span><span id="line-4534"></span> |
| <span class="source-line-no">4535</span><span id="line-4535"> /**</span> |
| <span class="source-line-no">4536</span><span id="line-4536"> * Bean property namer.</span> |
| <span class="source-line-no">4537</span><span id="line-4537"> *</span> |
| <span class="source-line-no">4538</span><span id="line-4538"> * @see BeanContext.Builder#propertyNamer(Class)</span> |
| <span class="source-line-no">4539</span><span id="line-4539"> * @return</span> |
| <span class="source-line-no">4540</span><span id="line-4540"> * The interface used to calculate bean property names.</span> |
| <span class="source-line-no">4541</span><span id="line-4541"> */</span> |
| <span class="source-line-no">4542</span><span id="line-4542"> public final PropertyNamer getPropertyNamer() {</span> |
| <span class="source-line-no">4543</span><span id="line-4543"> return propertyNamerBean;</span> |
| <span class="source-line-no">4544</span><span id="line-4544"> }</span> |
| <span class="source-line-no">4545</span><span id="line-4545"></span> |
| <span class="source-line-no">4546</span><span id="line-4546"> /**</span> |
| <span class="source-line-no">4547</span><span id="line-4547"> * Sort bean properties.</span> |
| <span class="source-line-no">4548</span><span id="line-4548"> *</span> |
| <span class="source-line-no">4549</span><span id="line-4549"> * @see BeanContext.Builder#sortProperties()</span> |
| <span class="source-line-no">4550</span><span id="line-4550"> * @return</span> |
| <span class="source-line-no">4551</span><span id="line-4551"> * <jk>true</jk> if all bean properties will be serialized and access in alphabetical order.</span> |
| <span class="source-line-no">4552</span><span id="line-4552"> */</span> |
| <span class="source-line-no">4553</span><span id="line-4553"> public final boolean isSortProperties() {</span> |
| <span class="source-line-no">4554</span><span id="line-4554"> return sortProperties;</span> |
| <span class="source-line-no">4555</span><span id="line-4555"> }</span> |
| <span class="source-line-no">4556</span><span id="line-4556"></span> |
| <span class="source-line-no">4557</span><span id="line-4557"> /**</span> |
| <span class="source-line-no">4558</span><span id="line-4558"> * Use enum names.</span> |
| <span class="source-line-no">4559</span><span id="line-4559"> *</span> |
| <span class="source-line-no">4560</span><span id="line-4560"> * @see BeanContext.Builder#useEnumNames()</span> |
| <span class="source-line-no">4561</span><span id="line-4561"> * @return</span> |
| <span class="source-line-no">4562</span><span id="line-4562"> * <jk>true</jk> if enums are always serialized by name, not using {@link Object#toString()}.</span> |
| <span class="source-line-no">4563</span><span id="line-4563"> */</span> |
| <span class="source-line-no">4564</span><span id="line-4564"> public final boolean isUseEnumNames() {</span> |
| <span class="source-line-no">4565</span><span id="line-4565"> return useEnumNames;</span> |
| <span class="source-line-no">4566</span><span id="line-4566"> }</span> |
| <span class="source-line-no">4567</span><span id="line-4567"></span> |
| <span class="source-line-no">4568</span><span id="line-4568"> /**</span> |
| <span class="source-line-no">4569</span><span id="line-4569"> * Use interface proxies.</span> |
| <span class="source-line-no">4570</span><span id="line-4570"> *</span> |
| <span class="source-line-no">4571</span><span id="line-4571"> * @see BeanContext.Builder#disableInterfaceProxies()</span> |
| <span class="source-line-no">4572</span><span id="line-4572"> * @return</span> |
| <span class="source-line-no">4573</span><span id="line-4573"> * <jk>true</jk> if interfaces will be instantiated as proxy classes through the use of an</span> |
| <span class="source-line-no">4574</span><span id="line-4574"> * {@link InvocationHandler} if there is no other way of instantiating them.</span> |
| <span class="source-line-no">4575</span><span id="line-4575"> */</span> |
| <span class="source-line-no">4576</span><span id="line-4576"> public final boolean isUseInterfaceProxies() {</span> |
| <span class="source-line-no">4577</span><span id="line-4577"> return useInterfaceProxies;</span> |
| <span class="source-line-no">4578</span><span id="line-4578"> }</span> |
| <span class="source-line-no">4579</span><span id="line-4579"></span> |
| <span class="source-line-no">4580</span><span id="line-4580"> /**</span> |
| <span class="source-line-no">4581</span><span id="line-4581"> * Use Java Introspector.</span> |
| <span class="source-line-no">4582</span><span id="line-4582"> *</span> |
| <span class="source-line-no">4583</span><span id="line-4583"> * @see BeanContext.Builder#useJavaBeanIntrospector()</span> |
| <span class="source-line-no">4584</span><span id="line-4584"> * @return</span> |
| <span class="source-line-no">4585</span><span id="line-4585"> * <jk>true</jk> if the built-in Java bean introspector should be used for bean introspection.</span> |
| <span class="source-line-no">4586</span><span id="line-4586"> */</span> |
| <span class="source-line-no">4587</span><span id="line-4587"> public final boolean isUseJavaBeanIntrospector() {</span> |
| <span class="source-line-no">4588</span><span id="line-4588"> return useJavaBeanIntrospector;</span> |
| <span class="source-line-no">4589</span><span id="line-4589"> }</span> |
| <span class="source-line-no">4590</span><span id="line-4590"></span> |
| <span class="source-line-no">4591</span><span id="line-4591"> /**</span> |
| <span class="source-line-no">4592</span><span id="line-4592"> * Locale.</span> |
| <span class="source-line-no">4593</span><span id="line-4593"> *</span> |
| <span class="source-line-no">4594</span><span id="line-4594"> * @see BeanContext.Builder#locale(Locale)</span> |
| <span class="source-line-no">4595</span><span id="line-4595"> * @return</span> |
| <span class="source-line-no">4596</span><span id="line-4596"> * The default locale for serializer and parser sessions.</span> |
| <span class="source-line-no">4597</span><span id="line-4597"> */</span> |
| <span class="source-line-no">4598</span><span id="line-4598"> public final Locale getDefaultLocale() {</span> |
| <span class="source-line-no">4599</span><span id="line-4599"> return locale;</span> |
| <span class="source-line-no">4600</span><span id="line-4600"> }</span> |
| <span class="source-line-no">4601</span><span id="line-4601"></span> |
| <span class="source-line-no">4602</span><span id="line-4602"> /**</span> |
| <span class="source-line-no">4603</span><span id="line-4603"> * Media type.</span> |
| <span class="source-line-no">4604</span><span id="line-4604"> *</span> |
| <span class="source-line-no">4605</span><span id="line-4605"> * @see BeanContext.Builder#mediaType(MediaType)</span> |
| <span class="source-line-no">4606</span><span id="line-4606"> * @return</span> |
| <span class="source-line-no">4607</span><span id="line-4607"> * The default media type value for serializer and parser sessions.</span> |
| <span class="source-line-no">4608</span><span id="line-4608"> */</span> |
| <span class="source-line-no">4609</span><span id="line-4609"> public final MediaType getDefaultMediaType() {</span> |
| <span class="source-line-no">4610</span><span id="line-4610"> return mediaType;</span> |
| <span class="source-line-no">4611</span><span id="line-4611"> }</span> |
| <span class="source-line-no">4612</span><span id="line-4612"></span> |
| <span class="source-line-no">4613</span><span id="line-4613"> /**</span> |
| <span class="source-line-no">4614</span><span id="line-4614"> * Time zone.</span> |
| <span class="source-line-no">4615</span><span id="line-4615"> *</span> |
| <span class="source-line-no">4616</span><span id="line-4616"> * @see BeanContext.Builder#timeZone(TimeZone)</span> |
| <span class="source-line-no">4617</span><span id="line-4617"> * @return</span> |
| <span class="source-line-no">4618</span><span id="line-4618"> * The default timezone for serializer and parser sessions.</span> |
| <span class="source-line-no">4619</span><span id="line-4619"> */</span> |
| <span class="source-line-no">4620</span><span id="line-4620"> public final TimeZone getDefaultTimeZone() {</span> |
| <span class="source-line-no">4621</span><span id="line-4621"> return timeZone;</span> |
| <span class="source-line-no">4622</span><span id="line-4622"> }</span> |
| <span class="source-line-no">4623</span><span id="line-4623"></span> |
| <span class="source-line-no">4624</span><span id="line-4624"> /**</span> |
| <span class="source-line-no">4625</span><span id="line-4625"> * Returns the serializer to use for serializing beans when using the {@link BeanSession#convertToType(Object, Class)}</span> |
| <span class="source-line-no">4626</span><span id="line-4626"> * and related methods.</span> |
| <span class="source-line-no">4627</span><span id="line-4627"> *</span> |
| <span class="source-line-no">4628</span><span id="line-4628"> * @return The serializer. May be <jk>null</jk> if all initialization has occurred.</span> |
| <span class="source-line-no">4629</span><span id="line-4629"> */</span> |
| <span class="source-line-no">4630</span><span id="line-4630"> protected WriterSerializer getBeanToStringSerializer() {</span> |
| <span class="source-line-no">4631</span><span id="line-4631"> if (beanToStringSerializer == null) {</span> |
| <span class="source-line-no">4632</span><span id="line-4632"> if (JsonSerializer.DEFAULT == null)</span> |
| <span class="source-line-no">4633</span><span id="line-4633"> return null;</span> |
| <span class="source-line-no">4634</span><span id="line-4634"> this.beanToStringSerializer = JsonSerializer.create().beanContext(this).sq().simpleAttrs().build();</span> |
| <span class="source-line-no">4635</span><span id="line-4635"> }</span> |
| <span class="source-line-no">4636</span><span id="line-4636"> return beanToStringSerializer;</span> |
| <span class="source-line-no">4637</span><span id="line-4637"> }</span> |
| <span class="source-line-no">4638</span><span id="line-4638"></span> |
| <span class="source-line-no">4639</span><span id="line-4639"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">4640</span><span id="line-4640"> // Other methods</span> |
| <span class="source-line-no">4641</span><span id="line-4641"> //-----------------------------------------------------------------------------------------------------------------</span> |
| <span class="source-line-no">4642</span><span id="line-4642"></span> |
| <span class="source-line-no">4643</span><span id="line-4643"> @Override /* Context */</span> |
| <span class="source-line-no">4644</span><span id="line-4644"> protected JsonMap properties() {</span> |
| <span class="source-line-no">4645</span><span id="line-4645"> return filteredMap()</span> |
| <span class="source-line-no">4646</span><span id="line-4646"> .append("id", System.identityHashCode(this))</span> |
| <span class="source-line-no">4647</span><span id="line-4647"> .append("beanClassVisibility", beanClassVisibility)</span> |
| <span class="source-line-no">4648</span><span id="line-4648"> .append("beanConstructorVisibility", beanConstructorVisibility)</span> |
| <span class="source-line-no">4649</span><span id="line-4649"> .append("beanDictionary", beanDictionary)</span> |
| <span class="source-line-no">4650</span><span id="line-4650"> .append("beanFieldVisibility", beanFieldVisibility)</span> |
| <span class="source-line-no">4651</span><span id="line-4651"> .append("beanMethodVisibility", beanMethodVisibility)</span> |
| <span class="source-line-no">4652</span><span id="line-4652"> .append("beansRequireDefaultConstructor", beansRequireDefaultConstructor)</span> |
| <span class="source-line-no">4653</span><span id="line-4653"> .append("beansRequireSerializable", beansRequireSerializable)</span> |
| <span class="source-line-no">4654</span><span id="line-4654"> .append("beansRequireSettersForGetters", beansRequireSettersForGetters)</span> |
| <span class="source-line-no">4655</span><span id="line-4655"> .append("beansRequireSomeProperties", beansRequireSomeProperties)</span> |
| <span class="source-line-no">4656</span><span id="line-4656"> .append("ignoreTransientFields", ignoreTransientFields)</span> |
| <span class="source-line-no">4657</span><span id="line-4657"> .append("ignoreInvocationExceptionsOnGetters", ignoreInvocationExceptionsOnGetters)</span> |
| <span class="source-line-no">4658</span><span id="line-4658"> .append("ignoreInvocationExceptionsOnSetters", ignoreInvocationExceptionsOnSetters)</span> |
| <span class="source-line-no">4659</span><span id="line-4659"> .append("ignoreUnknownBeanProperties", ignoreUnknownBeanProperties)</span> |
| <span class="source-line-no">4660</span><span id="line-4660"> .append("ignoreUnknownNullBeanProperties", ignoreUnknownNullBeanProperties)</span> |
| <span class="source-line-no">4661</span><span id="line-4661"> .append("notBeanClasses", notBeanClasses)</span> |
| <span class="source-line-no">4662</span><span id="line-4662"> .append("notBeanPackageNames", notBeanPackageNames)</span> |
| <span class="source-line-no">4663</span><span id="line-4663"> .append("notBeanPackagePrefixes", notBeanPackagePrefixes)</span> |
| <span class="source-line-no">4664</span><span id="line-4664"> .append("swaps", swaps)</span> |
| <span class="source-line-no">4665</span><span id="line-4665"> .append("sortProperties", sortProperties)</span> |
| <span class="source-line-no">4666</span><span id="line-4666"> .append("useEnumNames", useEnumNames)</span> |
| <span class="source-line-no">4667</span><span id="line-4667"> .append("useInterfaceProxies", useInterfaceProxies)</span> |
| <span class="source-line-no">4668</span><span id="line-4668"> .append("useJavaBeanIntrospector", useJavaBeanIntrospector);</span> |
| <span class="source-line-no">4669</span><span id="line-4669"> }</span> |
| <span class="source-line-no">4670</span><span id="line-4670">}</span> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| </pre> |
| </div> |
| </main> |
| </body> |
| </html> |