Java String trim() method with Example
In this post, we feature a comprehensive article about the Java String trim() method with Examples.
1. Introduction
The java.lang.String
class represents character strings. It provides a trim()
method since version 1.4 to return a new string object whose value is the copy of the original string without any leading or trailing white-space.
Note: a white-space is when the ASCII code of the character is less than or equal to the space character, which is \u0020
.
Here is the method syntax:
1 | public String trim() |
In this example, I will demonstrate how to trim a string in three ways:
- Create a
Function
totrim
a string in JDK 8 or higher version - Invoke
trim
for a non-nullString
object - Invoke
trim
for anOptional
String
object
2. Technologies Used
The example code in this article was built and run using:
- Java 1.8.101
- Maven 3.3.9
- Eclipse Oxygen
- JUnit 4.12
- H2
- Spring
3. Maven Project
I will create a Maven project via the Spring starter tool. Enter the group and artifact values and click the Generate Project
button. A maven project will be generated and downloaded to your workstation. Import it into your Eclipse work space.
3.1 Dependency
Add H2
dependency to pom.xml
.
pom.xml
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | <? xml version = "1.0" encoding = "UTF-8" ?> < project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" < modelVersion >4.0.0</ modelVersion > < groupId >jcg.zheng.demo</ groupId > < artifactId >spring-string-trim-demo</ artifactId > < version >0.0.1-SNAPSHOT</ version > < packaging >jar</ packaging > < name >spring-jparepository-demo</ name > < description >Demo Spring Data JPA Application</ description > < parent > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-parent</ artifactId > < version >1.5.10.RELEASE</ version > < relativePath /> <!-- lookup parent from repository --> </ parent > < properties > < project.build.sourceEncoding >UTF-8</ project.build.sourceEncoding > < project.reporting.outputEncoding >UTF-8</ project.reporting.outputEncoding > < java.version >1.8</ java.version > </ properties > < dependencies > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-data-jpa</ artifactId > </ dependency > < dependency > < groupId >com.h2database</ groupId > < artifactId >h2</ artifactId > < scope >runtime</ scope > </ dependency > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-test</ artifactId > < scope >test</ scope > </ dependency > </ dependencies > < build > < plugins > < plugin > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-maven-plugin</ artifactId > </ plugin > </ plugins > </ build > </ project > |
3.2 Spring Boot Application
I will save contacts into a H2
database table via Spring JpaRepositories
. You just need to add @EnableJpaRepositories
to the generated DemoApplication.java
file.
DemoApplication.java
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | package jcg.zheng.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication @EnableJpaRepositories (basePackages = "jcg.zheng.demo" ) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication. class , args); } } |
3.3 Application Properties
Spring boot will configure a H2
data source based on the values in application.properties
.
application.properties
1 2 3 4 | spring.datasource.url=jdbc:h2: file :~ /main-source ;AUTO_SERVER=TRUE spring.datasource.username=sa spring.datasource.password= spring.datasource.driver-class-name=org.h2.Driver |
4. Contact
In this step, I will create a contact class that maps to a database table. It has several data members: id, first name, last name, and a title (optional). The Contact(String, String)
constructor uses setFirstName
and setLastName
to set the first name and last name with trimmed values.
Here are setters that trim a string in three ways:
setLastName
– it first creates a Java 8Function
totrim
a string with a method reference and then uses itsapply
method to set the last name value. Click my other article for details about Java 8 Function.setFirstName
– it calls thetrim
method on the first name.setTitle
– it invokes thetrim
method if a title exists.
Contact.java
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | package jcg.zheng.demo.entity; import java.util.Optional; import java.util.function.Function; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Transient; import org.springframework.util.StringUtils; @Entity public class Contact { @Id @GeneratedValue private Long id; private String firstName; private String lastName; @Transient private Optional<String> title; public Contact(String firstName, String lastName) { if (StringUtils.isEmpty(firstName) || StringUtils.isEmpty(lastName)) { throw new IllegalArgumentException( "Require both firstName and lastName" ); } setFirstName(firstName); setLastName(lastName); } public Long getId() { return id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this .firstName = firstName.trim(); } public String getLastName() { return lastName; } public void setLastName(String lastName) { Function<String, String> trimF = String::trim; this .lastName = trimF.apply(lastName); } public void setId(Long id) { this .id = id; } public Optional<String> getTitle() { return title; } public void setTitle(Optional<String> title) { this .title = title; if (title.isPresent()) { this .title = Optional.ofNullable(title.get().trim()); } } } |
4.1 ContactTest
I will create several unit tests to demonstrate that the contact’s getFirstName
and getLastName
methods return a name without any leading and trailing white-spaces.
contact_happypath
– It constructs a contact object with the first name as" Mary Shan "
and last name as" Zheng Jr "
. Please note that both names have leading and trailing white-spaces. The last name also has white-spaces in the middle. With the help of thetrim
method, both leading and trailing white-spaces are removed and the white-spaces in the middle remains as expected.contact_has_title
– It sets contact’s title with ” Developer “. Please note that the leading and trailing white-spaces are removed whengetTitle()
returns.
ContactTest.java
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | package jcg.zheng.demo.entity; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.Optional; import org.junit.Test; public class ContactTest { @Test public void contact_happypath() { Contact contact = new Contact( " Mary shan " , " Zheng Jr " ); assertEquals( "Mary shan" , contact.getFirstName()); assertEquals( "Zheng Jr" , contact.getLastName()); } @Test (expected = Exception. class ) public void contact_miss_names() { Contact contact = new Contact( null , "" ); } @Test public void contact_has_no_title() { Contact contact = new Contact( "Mary" , "Zheng" ); contact.setTitle(Optional.ofNullable( null )); assertFalse(contact.getTitle().isPresent()); } @Test public void contact_has_title() { Contact contact = new Contact( "Mary " , "Zheng" ); contact.setTitle(Optional.ofNullable( " Developer " )); assertTrue(contact.getTitle().isPresent()); assertEquals( "Developer" , contact.getTitle().get()); } } |
4.2 Demo
Execute mvn test -Dtest=ContactTest
. All tests should pass. Capture the output here.
Test results
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | C:\JCG\spring-string-trim-demo>mvn test -Dtest=ContactTest [INFO] Scanning for projects... [INFO] [INFO] ---------------< jcg.zheng.demo:spring-string-trim-demo >--------------- [INFO] Building spring-jparepository-demo 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ spring-string-trim-demo --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ spring-string-trim-demo --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ spring-string-trim-demo --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory C:\JCG\spring-string-trim-demo\src\ test \resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ spring-string-trim-demo --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-surefire-plugin:2.18.1: test (default- test ) @ spring-string-trim-demo --- [INFO] Surefire report directory: C:\JCG\spring-string-trim-demo\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running jcg.zheng.demo.entity.ContactTest Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.242 sec - in jcg.zheng.demo.entity.ContactTest Results : Tests run: 4, Failures: 0, Errors: 0, Skipped: 0 |
5. ContactRepository
I will create a ContactRepository
class to save contacts into a database without any leading and trailing white-spaces. Click here for my other article Spring JPARepository.
CommonRepository.java
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 | package jcg.zheng.demo.repository; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import jcg.zheng.demo.entity.Contact; @Repository @Transactional public interface ContactRepository extends JpaRepository<Contact, Long> { @Query ( "SELECT con FROM Contact con WHERE con.lastName= (:lName)" ) List<Contact> findByLastName( @Param ( "lName" ) String lName); } |
5.1 ContactRepositoryTest
We have a contact class whose constructor accepts first name and last name and three setter
methods trim a string. In this step, I will create test cases with three steps:
- Construct a contact with both leading and trailing white-spaces names.
- Save the contact into a H2 database table.
- Find the saved contact and check the saved values have no any leading and trailing white-spaces.
CommonRepositoryTest.java
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package jcg.zheng.demo.repository; import static org.junit.Assert.assertEquals; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.junit4.SpringRunner; import jcg.zheng.demo.entity.Contact; @RunWith (SpringRunner. class ) @DataJpaTest public class ContactRepositoryTest { @Autowired private ContactRepository contactRepo; @Test public void it_can_find_the_contact_after_save_it() { Contact contact = new Contact( " Mary " , " Zheng" ); contactRepo.save(contact); List contacts = contactRepo.findAll(); assertEquals( 1 , contacts.size()); assertEquals( "Mary" , contacts.get( 0 ).getFirstName()); assertEquals( "Zheng" , contacts.get( 0 ).getLastName()); } @Test public void it_can_find_contacts_by_name() { contactRepo.save( new Contact( " Mary" , " Zheng " )); contactRepo.save( new Contact( "Tom" , "Smith" )); contactRepo.save( new Contact( "John" , "Joe" )); contactRepo.save( new Contact( "Cindy " , "Zheng" )); List contactsWithZheng = contactRepo.findByLastName( "Zheng" ); assertEquals( 2 , contactsWithZheng.size()); Contact foundMary = contactsWithZheng.stream() .filter(con -> con.getFirstName().equalsIgnoreCase( "Mary" )) .findFirst().get(); assertEquals( "Mary" , foundMary.getFirstName()); Contact foundCindy = contactsWithZheng.stream() .filter(con -> con.getFirstName().equalsIgnoreCase( "Cindy" )) .findAny().get(); assertEquals( "Cindy" , foundCindy.getFirstName()); contactsWithZheng = contactRepo.findByLastName( " Zheng " ); assertEquals( 0 , contactsWithZheng.size()); } } |
5.2 Demo
Execute mvn test -Dtest=ContactRepositoryTest
. All tests should pass. Capture the output as the following.
Test Results
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 2019-02-16 11:53:20.518 INFO 17644 --- [ main] j.z.d.repository.ContactRepositoryTest : Starting ContactRepositoryTest on S443831 with PID 17644 (started by aa00765 in C:\JCG\spring-string-trim-demo) 2019-02-16 11:53:20.519 INFO 17644 --- [ main] j.z.d.repository.ContactRepositoryTest : No active profile set , falling back to default profiles: default 2019-02-16 11:53:20.549 INFO 17644 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@12aba8be: startup date [Sat Feb 16 11:53:20 CST 2019]; root of context hierarchy 2019-02-16 11:53:21.505 INFO 17644 --- [ main] beddedDataSourceBeanFactoryPostProcessor : Replacing 'dataSource' DataSource bean with embedded version 2019-02-16 11:53:21.507 INFO 17644 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'dataSource' with a different definition: replacing [Root bean: class [null]; scope=; abstract= false ; lazyInit= false ; autowireMode=3; dependencyCheck=0; autowireCandidate= true ; primary= false ; factoryBeanName=org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Tomcat; factoryMethodName=dataSource; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org /springframework/boot/autoconfigure/jdbc/DataSourceConfiguration $Tomcat.class]] with [Root bean: class [org.springframework.boot. test .autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceFactoryBean]; scope=; abstract= false ; lazyInit= false ; autowireMode=0; dependencyCheck=0; autowireCandidate= true ; primary= false ; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] 2019-02-16 11:53:22.090 INFO 17644 --- [ main] o.s.j.d.e.EmbeddedDatabaseFactory : Starting embedded database: url= 'jdbc:h2:mem:f15dc85a-1020-4cbb-8e97-688f3367bc69;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false' , username= 'sa' 2019-02-16 11:53:22.930 INFO 17644 --- [ main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default' 2019-02-16 11:53:22.978 INFO 17644 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [ name: default ...] 2019-02-16 11:53:23.162 INFO 17644 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core {5.0.12.Final} 2019-02-16 11:53:23.167 INFO 17644 --- [ main] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found 2019-02-16 11:53:23.171 INFO 17644 --- [ main] org.hibernate.cfg.Environment : HHH000021: Bytecode provider name : javassist 2019-02-16 11:53:23.317 INFO 17644 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.0.1.Final} 2019-02-16 11:53:23.711 INFO 17644 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect 2019-02-16 11:53:24.499 INFO 17644 --- [ main] org.hibernate.tuple.PojoInstantiator : HHH000182: No default (no-argument) constructor for class: jcg.zheng.demo.entity.Contact (class must be instantiated by Interceptor) 2019-02-16 11:53:24.703 INFO 17644 --- [ main] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000227: Running hbm2ddl schema export Hibernate: drop table contact if exists Hibernate: create table contact ( id bigint generated by default as identity, first_name varchar(255), last_name varchar(255), primary key ( id )) 2019-02-16 11:53:24.732 INFO 17644 --- [ main] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000230: Schema export complete 2019-02-16 11:53:24.844 INFO 17644 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2019-02-16 11:53:25.279 INFO 17644 --- [ main] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactory 2019-02-16 11:53:25.773 INFO 17644 --- [ main] j.z.d.repository.ContactRepositoryTest : Started ContactRepositoryTest in 6.167 seconds (JVM running for 11.505) 2019-02-16 11:53:25.976 INFO 17644 --- [ main] o.s.t.c.transaction.TransactionContext : Began transaction (1) for test context [DefaultTestContext@7c469c48 testClass = ContactRepositoryTest, testInstance = jcg.zheng.demo.repository.ContactRepositoryTest@4313f5bc, testMethod = it_can_find_contacts_by_name@ContactRepositoryTest, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@12e61fe6 testClass = ContactRepositoryTest, locations = '{}' , classes = '{class jcg.zheng.demo.DemoApplication}' , contextInitializerClasses = '[]' , activeProfiles = '{}' , propertySourceLocations = '{}' , propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}' , contextCustomizers = set [[ImportsContextCustomizer@7ee955a8 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, org.springframework.boot. test .autoconfigure.jdbc.TestDatabaseAutoConfiguration, org.springframework.boot. test .autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration]], org.springframework.boot. test .context.filter.ExcludeFilterContextCustomizer@467aecef, org.springframework.boot. test .json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2173f6d9, org.springframework.boot. test .mock.mockito.MockitoContextCustomizer@0, org.springframework.boot. test .autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@5bb21b69, org.springframework.boot. test .autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot. test .autoconfigure.properties.PropertyMappingContextCustomizer@c763d37b, org.springframework.boot. test .autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@5ed828d], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader' , parent = [null]]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager@68ee3b6d]; rollback [ true ] Hibernate: insert into contact ( id , first_name, last_name) values (null, ?, ?) Hibernate: insert into contact ( id , first_name, last_name) values (null, ?, ?) Hibernate: insert into contact ( id , first_name, last_name) values (null, ?, ?) Hibernate: insert into contact ( id , first_name, last_name) values (null, ?, ?) Hibernate: select contact0_. id as id1_0_, contact0_.first_name as first_na2_0_, contact0_.last_name as last_nam3_0_ from contact contact0_ where contact0_.last_name=? Hibernate: select contact0_. id as id1_0_, contact0_.first_name as first_na2_0_, contact0_.last_name as last_nam3_0_ from contact contact0_ where contact0_.last_name=? 2019-02-16 11:53:26.246 INFO 17644 --- [ main] o.s.t.c.transaction.TransactionContext : Rolled back transaction for test context [DefaultTestContext@7c469c48 testClass = ContactRepositoryTest, testInstance = jcg.zheng.demo.repository.ContactRepositoryTest@4313f5bc, testMethod = it_can_find_contacts_by_name@ContactRepositoryTest, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@12e61fe6 testClass = ContactRepositoryTest, locations = '{}' , classes = '{class jcg.zheng.demo.DemoApplication}' , contextInitializerClasses = '[]' , activeProfiles = '{}' , propertySourceLocations = '{}' , propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}' , contextCustomizers = set [[ImportsContextCustomizer@7ee955a8 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, org.springframework.boot. test .autoconfigure.jdbc.TestDatabaseAutoConfiguration, org.springframework.boot. test .autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration]], org.springframework.boot. test .context.filter.ExcludeFilterContextCustomizer@467aecef, org.springframework.boot. test .json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2173f6d9, org.springframework.boot. test .mock.mockito.MockitoContextCustomizer@0, org.springframework.boot. test .autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@5bb21b69, org.springframework.boot. test .autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot. test .autoconfigure.properties.PropertyMappingContextCustomizer@c763d37b, org.springframework.boot. test .autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@5ed828d], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader' , parent = [null]]]. 2019-02-16 11:53:26.262 INFO 17644 --- [ main] o.s.t.c.transaction.TransactionContext : Began transaction (1) for test context [DefaultTestContext@7c469c48 testClass = ContactRepositoryTest, testInstance = jcg.zheng.demo.repository.ContactRepositoryTest@949c598, testMethod = it_can_find_the_contact_after_save_it@ContactRepositoryTest, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@12e61fe6 testClass = ContactRepositoryTest, locations = '{}' , classes = '{class jcg.zheng.demo.DemoApplication}' , contextInitializerClasses = '[]' , activeProfiles = '{}' , propertySourceLocations = '{}' , propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}' , contextCustomizers = set [[ImportsContextCustomizer@7ee955a8 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, org.springframework.boot. test .autoconfigure.jdbc.TestDatabaseAutoConfiguration, org.springframework.boot. test .autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration]], org.springframework.boot. test .context.filter.ExcludeFilterContextCustomizer@467aecef, org.springframework.boot. test .json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2173f6d9, org.springframework.boot. test .mock.mockito.MockitoContextCustomizer@0, org.springframework.boot. test .autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@5bb21b69, org.springframework.boot. test .autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot. test .autoconfigure.properties.PropertyMappingContextCustomizer@c763d37b, org.springframework.boot. test .autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@5ed828d], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader' , parent = [null]]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager@68ee3b6d]; rollback [ true ] Hibernate: insert into contact ( id , first_name, last_name) values (null, ?, ?) Hibernate: select contact0_. id as id1_0_, contact0_.first_name as first_na2_0_, contact0_.last_name as last_nam3_0_ from contact contact0_ 2019-02-16 11:53:26.375 INFO 17644 --- [ main] o.s.t.c.transaction.TransactionContext : Rolled back transaction for test context [DefaultTestContext@7c469c48 testClass = ContactRepositoryTest, testInstance = jcg.zheng.demo.repository.ContactRepositoryTest@949c598, testMethod = it_can_find_the_contact_after_save_it@ContactRepositoryTest, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@12e61fe6 testClass = ContactRepositoryTest, locations = '{}' , classes = '{class jcg.zheng.demo.DemoApplication}' , contextInitializerClasses = '[]' , activeProfiles = '{}' , propertySourceLocations = '{}' , propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}' , contextCustomizers = set [[ImportsContextCustomizer@7ee955a8 key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, org.springframework.boot. test .autoconfigure.jdbc.TestDatabaseAutoConfiguration, org.springframework.boot. test .autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration]], org.springframework.boot. test .context.filter.ExcludeFilterContextCustomizer@467aecef, org.springframework.boot. test .json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2173f6d9, org.springframework.boot. test .mock.mockito.MockitoContextCustomizer@0, org.springframework.boot. test .autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@5bb21b69, org.springframework.boot. test .autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot. test .autoconfigure.properties.PropertyMappingContextCustomizer@c763d37b, org.springframework.boot. test .autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@5ed828d], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader' , parent = [null]]]. Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.687 sec - in jcg.zheng.demo.repository.ContactRepositoryTest 2019-02-16 11:53:26.392 INFO 17644 --- [ Thread-3] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@12aba8be: startup date [Sat Feb 16 11:53:20 CST 2019]; root of context hierarchy 2019-02-16 11:53:26.399 INFO 17644 --- [ Thread-3] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2019-02-16 11:53:26.400 INFO 17644 --- [ Thread-3] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000227: Running hbm2ddl schema export Hibernate: drop table contact if exists 2019-02-16 11:53:26.415 INFO 17644 --- [ Thread-3] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000230: Schema export complete Results : Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time : 28.066 s [INFO] Finished at: 2019-02-16T11:53:26-06:00 [INFO] ------------------------------------------------------------------------ C:\JCG\spring-string-trim-demo> |
6. Java String trim() method – Summary
In this example, I demonstrated how to trim a string value in three ways:
- Create a
Function
totrim
a string in JDK8+ - Invoke
trim
for a non-nullString
object - Invoke
trim
for anOptional
String
object
7. Download the Source Code
This example consists of a Maven project which trims a string before saving it into a database table.
You can download the full source code of this example here: Java String trim() method with Example
Last updated on May 7th, 2020