[ https://issues.apache.org/jira/browse/SANDBOX-501?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15006027#comment-15006027 ]
Matthew P Mann edited comment on SANDBOX-501 at 11/15/15 9:04 PM: ------------------------------------------------------------------ ... and more tinkering. See [attached patch|https://issues.apache.org/jira/secure/attachment/12772417/commons-beanutils2.2015-11-15.patch]. {code} public class StringToArrayTest { private StringToArray converter; private ConverterRegistry converterRegistry; @Before public void setUp() { converter = new StringToArray(); converterRegistry = new ConverterRegistry() .register(converter) .register(new JsonNumberConverter()) .register(new JsonStringConverter()) .register(new JsonArrayToArray()) .register(BigDecimal::toBigIntegerExact) .register(Address::parse) .register(FunctionConverter.from(BigDecimal.class).to(double.class).using(BigDecimal::doubleValue)) .register(FunctionConverter.from(BigDecimal.class).to(int.class).using(BigDecimal::intValueExact)) .register(FunctionConverter.from(String.class).to(BigDecimal.class).using(BigDecimal::new)) .register(FunctionConverter.from(String.class).to(char.class).using(string -> { if (length(string) != 1) { throw new IllegalArgumentException(string); } return string.charAt(0); })); } @Test public void convert_StringToAddressArray() { final String source = "[ \"1600 Pennsylvania Avenue Northwest, Washington, DC 20500\", \"11 Wall Street, New York, NY 10005, US\", \"350 Fifth Avenue, New York, NY 10118\", \"4059 Mt Lee Drive, Hollywood, CA 90068\"]"; assertTrue(converter.canConvert(String.class, Address[].class)); final Address[] addresses = converter.convert(source, Address[].class, converterRegistry); assertEquals(4, addresses.length); assertEquals("1600 Pennsylvania Avenue Northwest", addresses[0].getStreetAddress()); assertEquals("Washington", addresses[0].getCity()); assertEquals(State.DC, addresses[0].getStateCode()); assertEquals("20500", addresses[0].getPostalCode()); assertNull(addresses[0].getCountryCode()); assertEquals("11 Wall Street", addresses[1].getStreetAddress()); assertEquals("New York", addresses[1].getCity()); assertEquals(State.NY, addresses[1].getStateCode()); assertEquals("10005", addresses[1].getPostalCode()); assertEquals("US", addresses[1].getCountryCode()); assertEquals("350 Fifth Avenue", addresses[2].getStreetAddress()); assertEquals("New York", addresses[2].getCity()); assertEquals(State.NY, addresses[2].getStateCode()); assertEquals("10118", addresses[2].getPostalCode()); assertNull(addresses[2].getCountryCode()); assertEquals("4059 Mt Lee Drive", addresses[3].getStreetAddress()); assertEquals("Hollywood", addresses[3].getCity()); assertEquals(State.CA, addresses[3].getStateCode()); assertEquals("90068", addresses[3].getPostalCode()); assertNull(addresses[3].getCountryCode()); } ... } {code} was (Author: mattmann): ... and more tinkering. See [attached patch|https://issues.apache.org/jira/secure/attachment/12772417/commons-beanutils2.2015-11-15.patch]. {code} public class StringToArrayTest { private StringToArray converter; private ConverterRegistry converterRegistry; @Before public void setUp() { converter = new StringToArray(); converterRegistry = new ConverterRegistry() .register(converter) .register(new JsonNumberConverter()) .register(new JsonStringConverter()) .register(new JsonArrayToArray()) .register(BigDecimal::toBigIntegerExact) .register(Address::parse) .register(FunctionConverter.from(BigDecimal.class).to(double.class).using(BigDecimal::doubleValue)) .register(FunctionConverter.from(BigDecimal.class).to(int.class).using(BigDecimal::intValueExact)) .register(FunctionConverter.from(String.class).to(BigDecimal.class).using(BigDecimal::new)) .register(FunctionConverter.from(String.class).to(char.class).using(string -> { if (length(string) != 1) { throw new IllegalArgumentException(string); } return string.charAt(0); })); } @Test public void convert_StringToAddressArray() { final String source = "[ \"1600 Pennsylvania Avenue Northwest, Washington, DC 20500\", \"11 Wall Street, New York, NY 10005, US\", \"350 Fifth Avenue, New York, NY 10118\", \"4059 Mt Lee Drive, Hollywood, CA 90068\"]"; assertTrue(converter.canConvert(String.class, Address[].class)); final Address[] addresses = converter.convert(source, Address[].class, converterRegistry); assertEquals(4, addresses.length); assertEquals("1600 Pennsylvania Avenue Northwest", addresses[0].getStreetAddress()); assertEquals("Washington", addresses[0].getCity()); assertEquals(State.DC, addresses[0].getStateCode()); assertEquals("20500", addresses[0].getPostalCode()); assertNull(addresses[0].getCountryCode()); assertEquals("11 Wall Street", addresses[1].getStreetAddress()); assertEquals("New York", addresses[1].getCity()); assertEquals(State.NY, addresses[1].getStateCode()); assertEquals("10005", addresses[1].getPostalCode()); assertEquals("US", addresses[1].getCountryCode()); assertEquals("350 Fifth Avenue", addresses[2].getStreetAddress()); assertEquals("New York", addresses[2].getCity()); assertEquals(State.NY, addresses[2].getStateCode()); assertEquals("10118", addresses[2].getPostalCode()); assertNull(addresses[2].getCountryCode()); assertEquals("4059 Mt Lee Drive", addresses[3].getStreetAddress()); assertEquals("Hollywood", addresses[3].getCity()); assertEquals(State.CA, addresses[3].getStateCode()); assertEquals("90068", addresses[3].getPostalCode()); assertNull(addresses[3].getCountryCode()); } ... } {code} > Add configurable type conversion support > ---------------------------------------- > > Key: SANDBOX-501 > URL: https://issues.apache.org/jira/browse/SANDBOX-501 > Project: Commons Sandbox > Issue Type: New Feature > Components: BeanUtils2 > Reporter: Benedikt Ritter > Attachments: commons-beanutils2.2015-11-13.patch, > commons-beanutils2.2015-11-14.patch, commons-beanutils2.2015-11-15.patch, > commons-beanutils2.java8.patch > > > BeanUtils1 supports automatic type conversion when setting properties. This > should be added to BeanUtils2. > A problem of the implementation of BeanUtils1 is, that the registry of > converts is cached in the BeanUtils class. BeanUtils2 should provide an API > for creating new instances of the o.a.c.beanutils2.BeanUtils with a > customized typ conversion registry. -- This message was sent by Atlassian JIRA (v6.3.4#6332)