Consistently use annotation attributes in refdoc

This commit is contained in:
Brian Clozel 2016-08-26 09:38:19 +02:00
parent f93cb2f539
commit bbd5993945
7 changed files with 128 additions and 128 deletions

View File

@ -1358,10 +1358,10 @@ example, using the qualifier notation, the following Java code
---- ----
public class TransactionalService { public class TransactionalService {
@Transactional("order") @Transactional(transactionManager = "order")
public void setSomething(String name) { ... } public void setSomething(String name) { ... }
@Transactional("account") @Transactional(transactionManager = "account")
public void doSomething() { ... } public void doSomething() { ... }
} }
---- ----
@ -1403,13 +1403,13 @@ defining the following annotations
---- ----
@Target({ElementType.METHOD, ElementType.TYPE}) @Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Transactional("order") @Transactional(transactionManager = "order")
public @interface OrderTx { public @interface OrderTx {
} }
@Target({ElementType.METHOD, ElementType.TYPE}) @Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Transactional("account") @Transactional(transactionManager = "account")
public @interface AccountTx { public @interface AccountTx {
} }
---- ----

View File

@ -8109,7 +8109,7 @@ of the cache associated with the annotated method:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@Cacheable("books") @Cacheable(cacheNames = "books")
public Book findBook(ISBN isbn) {...} public Book findBook(ISBN isbn) {...}
---- ----
@ -8130,7 +8130,7 @@ the cached method was not actually executed.
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@Cacheable({"books", "isbns"}) @Cacheable(cacheNames = ""books", "isbns"})
public Book findBook(ISBN isbn) {...} public Book findBook(ISBN isbn) {...}
---- ----
@ -8177,7 +8177,7 @@ caching (while the rest are used only by the method logic). For example:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@Cacheable("books") @Cacheable(cacheNames = "books")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed) public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
---- ----

View File

@ -446,8 +446,8 @@ used within a test class hierarchy.
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ContextHierarchy({ @ContextHierarchy({
@ContextConfiguration("/parent-config.xml"), @ContextConfiguration(locations = "/parent-config.xml"),
@ContextConfiguration("/child-config.xml") @ContextConfiguration(locations = "/child-config.xml")
}) })
public class ContextHierarchyTests { public class ContextHierarchyTests {
// class body... // class body...
@ -673,8 +673,8 @@ specified instead, as seen below.
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ContextHierarchy({ @ContextHierarchy({
@ContextConfiguration("/parent-config.xml"), @ContextConfiguration(locations = "/parent-config.xml"),
@ContextConfiguration("/child-config.xml") @ContextConfiguration(locations = "/child-config.xml")
}) })
public class BaseTests { public class BaseTests {
// class body... // class body...
@ -829,7 +829,7 @@ container annotation.
@Test @Test
**@SqlGroup**({ **@SqlGroup**({
@Sql(scripts = "/test-schema.sql", config = @SqlConfig(commentPrefix = "`")), @Sql(scripts = "/test-schema.sql", config = @SqlConfig(commentPrefix = "`")),
@Sql("/test-user-data.sql") @Sql(scripts = "/test-user-data.sql")
)} )}
public void userTest { public void userTest {
// execute code that uses the test schema and test data // execute code that uses the test schema and test data
@ -1009,14 +1009,14 @@ across our JUnit 4 based test suite...
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"}) @ContextConfiguration(locations = ""/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev") @ActiveProfiles(profiles = "dev")
@Transactional @Transactional
public class OrderRepositoryTests { } public class OrderRepositoryTests { }
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"}) @ContextConfiguration(locations = ""/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev") @ActiveProfiles(profiles = "dev")
@Transactional @Transactional
public class UserRepositoryTests { } public class UserRepositoryTests { }
---- ----
@ -1029,8 +1029,8 @@ that centralizes the common test configuration like this:
---- ----
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"}) @ContextConfiguration(locations = ""/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev") @ActiveProfiles(profiles = "dev")
@Transactional @Transactional
public @interface TransactionalDevTest { } public @interface TransactionalDevTest { }
---- ----
@ -1406,7 +1406,7 @@ demonstrated in the following example.
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
**@ContextConfiguration({"/app-config.xml", "/test-config.xml"})** **@ContextConfiguration(locations = ""/app-config.xml", "/test-config.xml"})**
public class MyTest { public class MyTest {
// class body... // class body...
} }
@ -1457,7 +1457,7 @@ TestContext Framework is enabled automatically if Groovy is on the classpath.
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
// ApplicationContext will be loaded from "/AppConfig.groovy" and // ApplicationContext will be loaded from "/AppConfig.groovy" and
// "/TestConfig.groovy" in the root of the classpath // "/TestConfig.groovy" in the root of the classpath
**@ContextConfiguration({"/AppConfig.groovy", "/TestConfig.Groovy"})** **@ContextConfiguration(locations = ""/AppConfig.groovy", "/TestConfig.Groovy"})**
public class MyTest { public class MyTest {
// class body... // class body...
} }
@ -1500,7 +1500,7 @@ The following listing demonstrates how to combine both in an integration test.
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
// ApplicationContext will be loaded from // ApplicationContext will be loaded from
// "/app-config.xml" and "/TestConfig.groovy" // "/app-config.xml" and "/TestConfig.groovy"
@ContextConfiguration({ "/app-config.xml", "/TestConfig.groovy" }) @ContextConfiguration(locations = " "/app-config.xml", "/TestConfig.groovy" })
public class MyTest { public class MyTest {
// class body... // class body...
} }
@ -1691,14 +1691,14 @@ therefore __override__ (i.e., replace) those defined in __"base-config.xml"__.
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
// ApplicationContext will be loaded from "/base-config.xml" // ApplicationContext will be loaded from "/base-config.xml"
// in the root of the classpath // in the root of the classpath
**@ContextConfiguration("/base-config.xml")** **@ContextConfiguration(locations = "/base-config.xml")**
public class BaseTest { public class BaseTest {
// class body... // class body...
} }
// ApplicationContext will be loaded from "/base-config.xml" and // ApplicationContext will be loaded from "/base-config.xml" and
// "/extended-config.xml" in the root of the classpath // "/extended-config.xml" in the root of the classpath
**@ContextConfiguration("/extended-config.xml")** **@ContextConfiguration(locations = "/extended-config.xml")**
public class ExtendedTest extends BaseTest { public class ExtendedTest extends BaseTest {
// class body... // class body...
} }
@ -1822,8 +1822,8 @@ Let's take a look at some examples with XML configuration and `@Configuration` c
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
// ApplicationContext will be loaded from "classpath:/app-config.xml" // ApplicationContext will be loaded from "classpath:/app-config.xml"
@ContextConfiguration("/app-config.xml") @ContextConfiguration(locations = "/app-config.xml")
@ActiveProfiles("dev") @ActiveProfiles(profiles = "dev")
public class TransferServiceTest { public class TransferServiceTest {
@Autowired @Autowired
@ -1843,7 +1843,7 @@ When `TransferServiceTest` is run, its `ApplicationContext` will be loaded from
`dataSource` is defined three times: in the __production__ profile, the `dataSource` is defined three times: in the __production__ profile, the
__dev__ profile, and the __default__ profile. __dev__ profile, and the __default__ profile.
By annotating `TransferServiceTest` with `@ActiveProfiles("dev")` we instruct the Spring By annotating `TransferServiceTest` with `@ActiveProfiles(profiles = "dev")` we instruct the Spring
TestContext Framework to load the `ApplicationContext` with the active profiles set to TestContext Framework to load the `ApplicationContext` with the active profiles set to
`{"dev"}`. As a result, an embedded database will be created and populated with test data, `{"dev"}`. As a result, an embedded database will be created and populated with test data,
and the `accountRepository` bean will be wired with a reference to the development and the `accountRepository` bean will be wired with a reference to the development
@ -1945,7 +1945,7 @@ integration test but using `@Configuration` classes instead of XML.
StandaloneDataConfig.class, StandaloneDataConfig.class,
JndiDataConfig.class, JndiDataConfig.class,
DefaultDataConfig.class}) DefaultDataConfig.class})
@ActiveProfiles("dev") @ActiveProfiles(profiles = "dev")
public class TransferServiceTest { public class TransferServiceTest {
@Autowired @Autowired
@ -1971,7 +1971,7 @@ In this variation, we have split the XML configuration into four independent
no profile is active no profile is active
As with the XML-based configuration example, we still annotate `TransferServiceTest` As with the XML-based configuration example, we still annotate `TransferServiceTest`
with `@ActiveProfiles("dev")`, but this time we specify all four configuration classes with `@ActiveProfiles(profiles = "dev")`, but this time we specify all four configuration classes
via the `@ContextConfiguration` annotation. The body of the test class itself remains via the `@ContextConfiguration` annotation. The body of the test class itself remains
completely unchanged. completely unchanged.
@ -1993,7 +1993,7 @@ annotations) has been moved to an abstract superclass, `AbstractIntegrationTest`
StandaloneDataConfig.class, StandaloneDataConfig.class,
JndiDataConfig.class, JndiDataConfig.class,
DefaultDataConfig.class}) DefaultDataConfig.class})
@ActiveProfiles("dev") @ActiveProfiles(profiles = "dev")
public abstract class AbstractIntegrationTest { public abstract class AbstractIntegrationTest {
} }
---- ----
@ -2121,7 +2121,7 @@ be loaded using the specified resource protocol. Resource location wildcards (e.
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ContextConfiguration @ContextConfiguration
@TestPropertySource("/test.properties") @TestPropertySource(locations = "/test.properties")
public class MyIntegrationTests { public class MyIntegrationTests {
// class body... // class body...
} }
@ -2211,13 +2211,13 @@ only the `"base.properties"` file as a test property source. In contrast, the
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@TestPropertySource("base.properties") @TestPropertySource(locations = "base.properties")
@ContextConfiguration @ContextConfiguration
public class BaseTest { public class BaseTest {
// ... // ...
} }
@TestPropertySource("extended.properties") @TestPropertySource(locations = "extended.properties")
@ContextConfiguration @ContextConfiguration
public class ExtendedTest extends BaseTest { public class ExtendedTest extends BaseTest {
// ... // ...
@ -2311,7 +2311,7 @@ nested `@Configuration` classes).
@WebAppConfiguration("webapp") @WebAppConfiguration("webapp")
// classpath resource // classpath resource
@ContextConfiguration("/spring/test-servlet-config.xml") @ContextConfiguration(locations = "/spring/test-servlet-config.xml")
public class WacTests { public class WacTests {
//... //...
@ -2334,7 +2334,7 @@ whereas, `@ContextConfiguration` resource locations are classpath based.
@WebAppConfiguration("classpath:test-web-resources") @WebAppConfiguration("classpath:test-web-resources")
// file system resource // file system resource
@ContextConfiguration("file:src/main/webapp/WEB-INF/servlet-config.xml") @ContextConfiguration(locations = "file:src/main/webapp/WEB-INF/servlet-config.xml")
public class WacTests { public class WacTests {
//... //...
@ -2554,13 +2554,13 @@ for the concrete subclasses.
---- ----
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@WebAppConfiguration @WebAppConfiguration
@ContextConfiguration("file:src/main/webapp/WEB-INF/applicationContext.xml") @ContextConfiguration(locations = "file:src/main/webapp/WEB-INF/applicationContext.xml")
public abstract class AbstractWebTests {} public abstract class AbstractWebTests {}
@ContextHierarchy(@ContextConfiguration("/spring/soap-ws-config.xml") @ContextHierarchy(@ContextConfiguration(locations = "/spring/soap-ws-config.xml")
public class SoapWebServiceTests extends AbstractWebTests {} public class SoapWebServiceTests extends AbstractWebTests {}
@ContextHierarchy(@ContextConfiguration("/spring/rest-ws-config.xml") @ContextHierarchy(@ContextConfiguration(locations = "/spring/rest-ws-config.xml")
public class RestWebServiceTests extends AbstractWebTests {} public class RestWebServiceTests extends AbstractWebTests {}
---- ----
-- --
@ -2693,7 +2693,7 @@ The first code listing shows a JUnit 4 based implementation of the test class th
---- ----
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
// specifies the Spring configuration to load for this test fixture // specifies the Spring configuration to load for this test fixture
**@ContextConfiguration("repository-config.xml")** **@ContextConfiguration(locations= " repository-config.xml")**
public class HibernateTitleRepositoryTests { public class HibernateTitleRepositoryTests {
// this instance will be dependency injected by type // this instance will be dependency injected by type
@ -2716,7 +2716,7 @@ seen below.
---- ----
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
// specifies the Spring configuration to load for this test fixture // specifies the Spring configuration to load for this test fixture
**@ContextConfiguration("repository-config.xml")** **@ContextConfiguration(locations= " repository-config.xml")**
public class HibernateTitleRepositoryTests { public class HibernateTitleRepositoryTests {
// this instance will be dependency injected by type // this instance will be dependency injected by type
@ -3097,7 +3097,7 @@ to run within a transaction.
`TransactionalTestExecutionListener` expects a `PlatformTransactionManager` bean to be `TransactionalTestExecutionListener` expects a `PlatformTransactionManager` bean to be
defined in the Spring `ApplicationContext` for the test. In case there are multiple defined in the Spring `ApplicationContext` for the test. In case there are multiple
instances of `PlatformTransactionManager` within the test's `ApplicationContext`, a instances of `PlatformTransactionManager` within the test's `ApplicationContext`, a
_qualifier_ may be declared via `@Transactional("myTxMgr")` or _qualifier_ may be declared via `@Transactional(transactionManager = "myTxMgr")` or
`@Transactional(transactionManager = "myTxMgr")`, or `TransactionManagementConfigurer` `@Transactional(transactionManager = "myTxMgr")`, or `TransactionManagementConfigurer`
can be implemented by an `@Configuration` class. Consult the javadocs for can be implemented by an `@Configuration` class. Consult the javadocs for
`TestContextTransactionUtils.retrieveTransactionManager()` for details on the algorithm `TestContextTransactionUtils.retrieveTransactionManager()` for details on the algorithm
@ -3320,7 +3320,7 @@ level within a JUnit 4 based integration test class.
---- ----
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@ContextConfiguration @ContextConfiguration
@Sql("/test-schema.sql") @Sql(scripts = "/test-schema.sql")
public class DatabaseTests { public class DatabaseTests {
@Test @Test
@ -3329,7 +3329,7 @@ level within a JUnit 4 based integration test class.
} }
@Test @Test
@Sql({"/test-schema.sql", "/test-user-data.sql"}) @Sql(scripts = ""/test-schema.sql", "/test-user-data.sql"})
public void userTest { public void userTest {
// execute code that uses the test schema and test data // execute code that uses the test schema and test data
} }
@ -3366,7 +3366,7 @@ single-line comments.
---- ----
@Test @Test
@Sql(scripts = "/test-schema.sql", config = @SqlConfig(commentPrefix = "`")) @Sql(scripts = "/test-schema.sql", config = @SqlConfig(commentPrefix = "`"))
@Sql("/test-user-data.sql") @Sql(scripts = "/test-user-data.sql")
public void userTest { public void userTest {
// execute code that uses the test schema and test data // execute code that uses the test schema and test data
} }
@ -3381,7 +3381,7 @@ grouped together within `@SqlGroup` for compatibility with Java 6 and Java 7.
@Test @Test
@SqlGroup({ @SqlGroup({
@Sql(scripts = "/test-schema.sql", config = @SqlConfig(commentPrefix = "`")), @Sql(scripts = "/test-schema.sql", config = @SqlConfig(commentPrefix = "`")),
@Sql("/test-user-data.sql") @Sql(scripts = "/test-user-data.sql")
)} )}
public void userTest { public void userTest {
// execute code that uses the test schema and test data // execute code that uses the test schema and test data
@ -3482,7 +3482,7 @@ be automatically rolled back by the `TransactionalTestExecutionListener` (see
} }
@Test @Test
@Sql("/test-data.sql") @Sql(scripts = "/test-data.sql")
public void usersTest() { public void usersTest() {
// verify state in test database: // verify state in test database:
assertNumUsers(2); assertNumUsers(2);
@ -3719,7 +3719,7 @@ JUnit 4 based example of using Spring MVC Test:
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@WebAppConfiguration @WebAppConfiguration
@ContextConfiguration("test-servlet-context.xml") @ContextConfiguration(locations= " test-servlet-context.xml")
public class ExampleTests { public class ExampleTests {
@Autowired @Autowired
@ -3779,7 +3779,7 @@ into the test to use to build a `MockMvc` instance:
---- ----
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@WebAppConfiguration @WebAppConfiguration
@ContextConfiguration("my-servlet-context.xml") @ContextConfiguration(locations= " my-servlet-context.xml")
public class MyWebTests { public class MyWebTests {
@Autowired @Autowired
@ -3844,7 +3844,7 @@ expectations:
---- ----
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@WebAppConfiguration @WebAppConfiguration
@ContextConfiguration("test-servlet-context.xml") @ContextConfiguration(locations= " test-servlet-context.xml")
public class AccountTests { public class AccountTests {
@Autowired @Autowired

View File

@ -43,11 +43,11 @@ it. By default `@CrossOrigin` allows all origins and the HTTP methods specified
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RestController @RestController
@RequestMapping("/account") @RequestMapping(path = "/account")
public class AccountController { public class AccountController {
@CrossOrigin @CrossOrigin
@RequestMapping("/{id}") @RequestMapping(path = "/{id}")
public Account retrieve(@PathVariable Long id) { public Account retrieve(@PathVariable Long id) {
// ... // ...
} }
@ -66,10 +66,10 @@ It is also possible to enable CORS for the whole controller:
---- ----
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600) @CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController @RestController
@RequestMapping("/account") @RequestMapping(path = "/account")
public class AccountController { public class AccountController {
@RequestMapping("/{id}") @RequestMapping(path = "/{id}")
public Account retrieve(@PathVariable Long id) { public Account retrieve(@PathVariable Long id) {
// ... // ...
} }
@ -93,11 +93,11 @@ then combine attributes from both annotations to create merged CORS configuratio
---- ----
@CrossOrigin(maxAge = 3600) @CrossOrigin(maxAge = 3600)
@RestController @RestController
@RequestMapping("/account") @RequestMapping(path = "/account")
public class AccountController { public class AccountController {
@CrossOrigin("http://domain2.com") @CrossOrigin(origins = "http://domain2.com")
@RequestMapping("/{id}") @RequestMapping(path = "/{id}")
public Account retrieve(@PathVariable Long id) { public Account retrieve(@PathVariable Long id) {
// ... // ...
} }

View File

@ -497,7 +497,7 @@ and others.
@Controller @Controller
public class HelloWorldController { public class HelloWorldController {
@RequestMapping("/helloWorld") @RequestMapping(path = "/helloWorld")
public String helloWorld(Model model) { public String helloWorld(Model model) {
model.addAttribute("message", "Hello World!"); model.addAttribute("message", "Hello World!");
return "helloWorld"; return "helloWorld";
@ -575,7 +575,7 @@ application that uses this annotation:
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@Controller @Controller
**@RequestMapping("/appointments")** **@RequestMapping(path = "/appointments")**
public class AppointmentsController { public class AppointmentsController {
private final AppointmentBook appointmentBook; private final AppointmentBook appointmentBook;
@ -639,11 +639,11 @@ application shows a multi-action controller using `@RequestMapping`:
this.clinic = clinic; this.clinic = clinic;
} }
**@RequestMapping("/")** **@RequestMapping(path = "/")**
public void welcomeHandler() { public void welcomeHandler() {
} }
**@RequestMapping("/vets")** **@RequestMapping(path = "/vets")**
public ModelMap vetsHandler() { public ModelMap vetsHandler() {
return new ModelMap(this.clinic.getVets()); return new ModelMap(this.clinic.getVets());
} }
@ -676,7 +676,7 @@ previous section that has been simplified with _composed_ `@RequestMapping` anno
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@Controller @Controller
**@RequestMapping("/appointments")** **@RequestMapping(path = "/appointments")**
public class AppointmentsController { public class AppointmentsController {
private final AppointmentBook appointmentBook; private final AppointmentBook appointmentBook;
@ -691,12 +691,12 @@ previous section that has been simplified with _composed_ `@RequestMapping` anno
return appointmentBook.getAppointmentsForToday(); return appointmentBook.getAppointmentsForToday();
} }
**@GetMapping("/{day}")** **@GetMapping(path = "/{day}")**
public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso=ISO.DATE) Date day, Model model) { public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso=ISO.DATE) Date day, Model model) {
return appointmentBook.getAppointmentsForDay(day); return appointmentBook.getAppointmentsForDay(day);
} }
**@GetMapping("/new")** **@GetMapping(path = "/new")**
public AppointmentForm getNewForm() { public AppointmentForm getNewForm() {
return new AppointmentForm(); return new AppointmentForm();
} }
@ -785,7 +785,7 @@ to the value of a URI template variable:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@GetMapping("/owners/{ownerId}") @GetMapping(path = "/owners/{ownerId}")
public String findOwner(**@PathVariable** String ownerId, Model model) { public String findOwner(**@PathVariable** String ownerId, Model model) {
Owner owner = ownerService.findOwner(ownerId); Owner owner = ownerService.findOwner(ownerId);
model.addAttribute("owner", owner); model.addAttribute("owner", owner);
@ -807,7 +807,7 @@ template variable by name. You can specify it in the annotation:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@GetMapping("/owners/{ownerId}") @GetMapping(path = "/owners/{ownerId}")
public String findOwner(**@PathVariable("ownerId")** String theOwner, Model model) { public String findOwner(**@PathVariable("ownerId")** String theOwner, Model model) {
// implementation omitted // implementation omitted
} }
@ -821,7 +821,7 @@ template variable name:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@GetMapping("/owners/{ownerId}") @GetMapping(path = "/owners/{ownerId}")
public String findOwner(**@PathVariable** String ownerId, Model model) { public String findOwner(**@PathVariable** String ownerId, Model model) {
// implementation omitted // implementation omitted
} }
@ -833,7 +833,7 @@ A method can have any number of `@PathVariable` annotations:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@GetMapping("/owners/{ownerId}/pets/{petId}") @GetMapping(path = "/owners/{ownerId}/pets/{petId}")
public String findPet(**@PathVariable** String ownerId, **@PathVariable** String petId, Model model) { public String findPet(**@PathVariable** String ownerId, **@PathVariable** String petId, Model model) {
Owner owner = ownerService.findOwner(ownerId); Owner owner = ownerService.findOwner(ownerId);
Pet pet = owner.getPet(petId); Pet pet = owner.getPet(petId);
@ -882,7 +882,7 @@ name and the second - the regular expression. For example:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}") @RequestMapping(path = "/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}")
public void handle(@PathVariable String version, @PathVariable String extension) { public void handle(@PathVariable String version, @PathVariable String extension) {
// ... // ...
} }
@ -1031,7 +1031,7 @@ Below is an example of extracting the matrix variable "q":
---- ----
// GET /pets/42;q=11;r=22 // GET /pets/42;q=11;r=22
@GetMapping("/pets/{petId}") @GetMapping(path = "/pets/{petId}")
public void findPet(@PathVariable String petId, @MatrixVariable int q) { public void findPet(@PathVariable String petId, @MatrixVariable int q) {
// petId == 42 // petId == 42
@ -1048,7 +1048,7 @@ specific to identify where the variable is expected to be:
---- ----
// GET /owners/42;q=11/pets/21;q=22 // GET /owners/42;q=11/pets/21;q=22
@GetMapping("/owners/{ownerId}/pets/{petId}") @GetMapping(path = "/owners/{ownerId}/pets/{petId}")
public void findPet( public void findPet(
@MatrixVariable(name="q", pathVar="ownerId") int q1, @MatrixVariable(name="q", pathVar="ownerId") int q1,
@MatrixVariable(name="q", pathVar="petId") int q2) { @MatrixVariable(name="q", pathVar="petId") int q2) {
@ -1066,7 +1066,7 @@ A matrix variable may be defined as optional and a default value specified:
---- ----
// GET /pets/42 // GET /pets/42
@GetMapping("/pets/{petId}") @GetMapping(path = "/pets/{petId}")
public void findPet(@MatrixVariable(required=false, defaultValue="1") int q) { public void findPet(@MatrixVariable(required=false, defaultValue="1") int q) {
// q == 1 // q == 1
@ -1081,7 +1081,7 @@ All matrix variables may be obtained in a Map:
---- ----
// GET /owners/42;q=11;r=12/pets/21;q=22;s=23 // GET /owners/42;q=11;r=12/pets/21;q=22;s=23
@GetMapping("/owners/{ownerId}/pets/{petId}") @GetMapping(path = "/owners/{ownerId}/pets/{petId}")
public void findPet( public void findPet(
@MatrixVariable MultiValueMap<String, String> matrixVars, @MatrixVariable MultiValueMap<String, String> matrixVars,
@MatrixVariable(pathVar="petId"") MultiValueMap<String, String> petMatrixVars) { @MatrixVariable(pathVar="petId"") MultiValueMap<String, String> petMatrixVars) {
@ -1208,7 +1208,7 @@ example with a request parameter value condition:
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@Controller @Controller
@RequestMapping("/owners/{ownerId}") @RequestMapping(path = "/owners/{ownerId}")
public class RelativePathUriTemplateController { public class RelativePathUriTemplateController {
@GetMapping(path = "/pets/{petId}", **params = "myParam=myValue"**) @GetMapping(path = "/pets/{petId}", **params = "myParam=myValue"**)
@ -1226,7 +1226,7 @@ specific request header value:
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@Controller @Controller
@RequestMapping("/owners/{ownerId}") @RequestMapping(path = "/owners/{ownerId}")
public class RelativePathUriTemplateController { public class RelativePathUriTemplateController {
@GetMapping(path = "/pets", **headers = "myHeader=myValue"**) @GetMapping(path = "/pets", **headers = "myHeader=myValue"**)
@ -1380,7 +1380,7 @@ sample won't work:
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@PostMapping @PostMapping
public String processSubmit(**@ModelAttribute("pet") Pet pet**, Model model, **BindingResult result**) { ... } public String processSubmit(**@ModelAttribute(name = "pet") Pet pet**, Model model, **BindingResult result**) { ... }
---- ----
Note, that there is a `Model` parameter in between `Pet` and `BindingResult`. To get Note, that there is a `Model` parameter in between `Pet` and `BindingResult`. To get
@ -1390,7 +1390,7 @@ this working you have to reorder the parameters as follows:
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@PostMapping @PostMapping
public String processSubmit(**@ModelAttribute("pet") Pet pet**, **BindingResult result**, Model model) { ... } public String processSubmit(**@ModelAttribute(name = "pet") Pet pet**, **BindingResult result**, Model model) { ... }
---- ----
[NOTE] [NOTE]
@ -1463,14 +1463,14 @@ The following code snippet shows the usage:
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@Controller @Controller
@RequestMapping("/pets") @RequestMapping(path = "/pets")
@SessionAttributes("pet") @SessionAttributes(names = "pet")
public class EditPetForm { public class EditPetForm {
// ... // ...
@GetMapping @GetMapping
public String setupForm(**@RequestParam("petId") int petId**, ModelMap model) { public String setupForm(**@RequestParam(name = "petId") int petId**, ModelMap model) {
Pet pet = this.clinic.loadPet(petId); Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet); model.addAttribute("pet", pet);
return "petForm"; return "petForm";
@ -1501,7 +1501,7 @@ be bound to the value of the HTTP request body. For example:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@PutMapping("/something") @PutMapping(path = "/something")
public void handle(@RequestBody String body, Writer writer) throws IOException { public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body); writer.write(body);
} }
@ -1580,7 +1580,7 @@ response body (and not placed in a Model, or interpreted as a view name). For ex
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@GetMapping("/something") @GetMapping(path = "/something")
@ResponseBody @ResponseBody
public String helloWorld() { public String helloWorld() {
return "Hello World"; return "Hello World";
@ -1622,7 +1622,7 @@ so:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RequestMapping("/something") @RequestMapping(path = "/something")
public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException { public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException {
String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader"); String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader");
byte[] requestBody = requestEntity.getBody(); byte[] requestBody = requestEntity.getBody();
@ -1662,7 +1662,7 @@ couple of examples:
---- ----
// Add one attribute // Add one attribute
// The return value of the method is added to the model under the name "account" // The return value of the method is added to the model under the name "account"
// You can customize the name via @ModelAttribute("myAccount") // You can customize the name via @ModelAttribute(name = "myAccount")
@ModelAttribute @ModelAttribute
public Account addAccount(@RequestParam String number) { public Account addAccount(@RequestParam String number) {
@ -1728,7 +1728,7 @@ form field individually.
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@PostMapping("/owners/{ownerId}/pets/{petId}/edit") @PostMapping(path = "/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(**@ModelAttribute Pet pet**) { } public String processSubmit(**@ModelAttribute Pet pet**) { }
---- ----
@ -1750,8 +1750,8 @@ using an URI template variable and a type converter. Here is an example:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@PutMapping("/accounts/{account}") @PutMapping(path = "/accounts/{account}")
public String save(@ModelAttribute("account") Account account) { public String save(@ModelAttribute(name = "account") Account account) {
// ... // ...
} }
---- ----
@ -1775,8 +1775,8 @@ following the `@ModelAttribute` argument:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@PostMapping("/owners/{ownerId}/pets/{petId}/edit") @PostMapping(path = "/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(**@ModelAttribute("pet") Pet pet**, BindingResult result) { public String processSubmit(**@ModelAttribute(name = "pet") Pet pet**, BindingResult result) {
if (result.hasErrors()) { if (result.hasErrors()) {
return "petForm"; return "petForm";
@ -1808,7 +1808,7 @@ public Account findAccount(@PathVariable String accountId) {
return accountRepository.findOne(accountId); return accountRepository.findOne(accountId);
} }
@PostMapping("update") @PostMapping(path = "update")
public String update(@Valid AccountUpdateForm form, BindingResult result, public String update(@Valid AccountUpdateForm form, BindingResult result,
**@ModelAttribute(binding=false)** Account account) { **@ModelAttribute(binding=false)** Account account) {
@ -1824,8 +1824,8 @@ subsequently reported back to the user:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@PostMapping("/owners/{ownerId}/pets/{petId}/edit") @PostMapping(path = "/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(**@ModelAttribute("pet") Pet pet**, BindingResult result) { public String processSubmit(**@ModelAttribute(name = "pet") Pet pet**, BindingResult result) {
new PetValidator().validate(pet, result); new PetValidator().validate(pet, result);
if (result.hasErrors()) { if (result.hasErrors()) {
@ -1843,8 +1843,8 @@ annotation:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@PostMapping("/owners/{ownerId}/pets/{petId}/edit") @PostMapping(path = "/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(**@Valid @ModelAttribute("pet") Pet pet**, BindingResult result) { public String processSubmit(**@Valid @ModelAttribute(name = "pet") Pet pet**, BindingResult result) {
if (result.hasErrors()) { if (result.hasErrors()) {
return "petForm"; return "petForm";
@ -1875,8 +1875,8 @@ attribute name:
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@Controller @Controller
@RequestMapping("/editPet.do") @RequestMapping(path = "/editPet.do")
**@SessionAttributes("pet")** **@SessionAttributes(names = "pet")**
public class EditPetForm { public class EditPetForm {
// ... // ...
} }
@ -1893,7 +1893,7 @@ use the `@SessionAttribute` annotation on a method parameter:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RequestMapping("/") @RequestMapping(path = "/")
public String handle(**@SessionAttribute** User user) { public String handle(**@SessionAttribute** User user) {
// ... // ...
} }
@ -1917,7 +1917,7 @@ access pre-existing request attributes created by a filter or interceptor:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RequestMapping("/") @RequestMapping(path = "/")
public String handle(**@RequestAttribute** Client client) { public String handle(**@RequestAttribute** Client client) {
// ... // ...
} }
@ -1991,8 +1991,8 @@ The following code sample demonstrates how to get the value of the `JSESSIONID`
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RequestMapping("/displayHeaderInfo.do") @RequestMapping(path = "/displayHeaderInfo.do")
public void displayHeaderInfo(**@CookieValue("JSESSIONID")** String cookie) { public void displayHeaderInfo(**@CookieValue(name = "JSESSIONID")** String cookie) {
//... //...
} }
---- ----
@ -2027,9 +2027,9 @@ The following code sample demonstrates how to get the value of the `Accept-Encod
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RequestMapping("/displayHeaderInfo.do") @RequestMapping(path = "/displayHeaderInfo.do")
public void displayHeaderInfo(**@RequestHeader("Accept-Encoding")** String encoding, public void displayHeaderInfo(**@RequestHeader(name = "Accept-Encoding")** String encoding,
**@RequestHeader("Keep-Alive")** long keepAlive) { **@RequestHeader(name = "Keep-Alive")** long keepAlive) {
//... //...
} }
---- ----
@ -2046,7 +2046,7 @@ with all header values.
==== ====
Built-in support is available for converting a comma-separated string into an Built-in support is available for converting a comma-separated string into an
array/collection of strings or other types known to the type conversion system. For array/collection of strings or other types known to the type conversion system. For
example a method parameter annotated with `@RequestHeader("Accept")` may be of type example a method parameter annotated with `@RequestHeader(name = "Accept")` may be of type
`String` but also `String[]` or `List<String>`. `String` but also `String[]` or `List<String>`.
==== ====
@ -2181,7 +2181,7 @@ Both `@ControllerAdvice` and `@RestControllerAdvice` can target a subset of cont
public class AnnotationAdvice {} public class AnnotationAdvice {}
// Target all Controllers within specific packages // Target all Controllers within specific packages
@ControllerAdvice("org.example.controllers") @ControllerAdvice(basePackages = "org.example.controllers")
public class BasePackageAdvice {} public class BasePackageAdvice {}
// Target all Controllers assignable to specific classes // Target all Controllers assignable to specific classes
@ -2210,7 +2210,7 @@ the view class or interface to be used:
@RestController @RestController
public class UserController { public class UserController {
@GetMapping("/user") @GetMapping(path = "/user")
@JsonView(User.WithoutPasswordView.class) @JsonView(User.WithoutPasswordView.class)
public User getUser() { public User getUser() {
return new User("eric", "7!jd#h23"); return new User("eric", "7!jd#h23");
@ -2262,7 +2262,7 @@ to the model:
@Controller @Controller
public class UserController extends AbstractController { public class UserController extends AbstractController {
@GetMapping("/user") @GetMapping(path = "/user")
public String getUser(Model model) { public String getUser(Model model) {
model.addAttribute("user", new User("eric", "7!jd#h23")); model.addAttribute("user", new User("eric", "7!jd#h23"));
model.addAttribute(JsonView.class.getName(), User.WithoutPasswordView.class); model.addAttribute(JsonView.class.getName(), User.WithoutPasswordView.class);
@ -2332,7 +2332,7 @@ of such a controller method:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RequestMapping("/quotes") @RequestMapping(path = "/quotes")
@ResponseBody @ResponseBody
public DeferredResult<String> quotes() { public DeferredResult<String> quotes() {
DeferredResult<String> deferredResult = new DeferredResult<String>(); DeferredResult<String> deferredResult = new DeferredResult<String>();
@ -2444,7 +2444,7 @@ Here is an example of that:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RequestMapping("/events") @RequestMapping(path = "/events")
public ResponseBodyEmitter handle() { public ResponseBodyEmitter handle() {
ResponseBodyEmitter emitter = new ResponseBodyEmitter(); ResponseBodyEmitter emitter = new ResponseBodyEmitter();
// Save the emitter somewhere.. // Save the emitter somewhere..
@ -2503,7 +2503,7 @@ Here is an example of that:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RequestMapping("/download") @RequestMapping(path = "/download")
public StreamingResponseBody handle() { public StreamingResponseBody handle() {
return new StreamingResponseBody() { return new StreamingResponseBody() {
@Override @Override
@ -3007,7 +3007,7 @@ through `Model` nor `RedirectAttributes`. For example:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@PostMapping("/files/{path}") @PostMapping(path = "/files/{path}")
public String upload(...) { public String upload(...) {
// ... // ...
return "redirect:files/{path}"; return "redirect:files/{path}";
@ -3179,7 +3179,7 @@ application/atom+xml is shown below.
private List<SampleContent> contentList = new ArrayList<SampleContent>(); private List<SampleContent> contentList = new ArrayList<SampleContent>();
@GetMapping("/content") @GetMapping(path = "/content")
public ModelAndView getContent() { public ModelAndView getContent() {
ModelAndView mav = new ModelAndView(); ModelAndView mav = new ModelAndView();
mav.setViewName("content"); mav.setViewName("content");
@ -3324,10 +3324,10 @@ Spring MVC also provides a mechanism for building links to controller methods. F
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@Controller @Controller
@RequestMapping("/hotels/{hotel}") @RequestMapping(path = "/hotels/{hotel}")
public class BookingController { public class BookingController {
@GetMapping("/bookings/{booking}") @GetMapping(path = "/bookings/{booking}")
public String getBooking(@PathVariable Long booking) { public String getBooking(@PathVariable Long booking) {
// ... // ...
@ -3418,10 +3418,10 @@ For example given:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@RequestMapping("/people/{id}/addresses") @RequestMapping(path = "/people/{id}/addresses")
public class PersonAddressController { public class PersonAddressController {
@RequestMapping("/{country}") @RequestMapping(path = "/{country}")
public HttpEntity getAddress(@PathVariable String country) { ... } public HttpEntity getAddress(@PathVariable String country) { ... }
} }
---- ----
@ -3792,9 +3792,9 @@ use `MultipartHttpServletRequest` or `MultipartFile` in the method parameters:
@Controller @Controller
public class FileUploadController { public class FileUploadController {
@PostMapping("/form") @PostMapping(path = "/form")
public String handleFormUpload(@RequestParam("name") String name, public String handleFormUpload(@RequestParam(name = "name") String name,
@RequestParam("file") MultipartFile file) { @RequestParam(name = "file") MultipartFile file) {
if (!file.isEmpty()) { if (!file.isEmpty()) {
byte[] bytes = file.getBytes(); byte[] bytes = file.getBytes();
@ -3821,9 +3821,9 @@ the method parameter:
@Controller @Controller
public class FileUploadController { public class FileUploadController {
@PostMapping("/form") @PostMapping(path = "/form")
public String handleFormUpload(@RequestParam("name") String name, public String handleFormUpload(@RequestParam(name = "name") String name,
@RequestParam("file") Part file) { @RequestParam(name = "file") Part file) {
InputStream inputStream = file.getInputStream(); InputStream inputStream = file.getInputStream();
// store bytes from uploaded file somewhere // store bytes from uploaded file somewhere
@ -3865,7 +3865,7 @@ Content-Transfer-Encoding: 8bit
... File Data ... ... File Data ...
---- ----
You could access the part named "meta-data" with a `@RequestParam("meta-data") String You could access the part named "meta-data" with a `@RequestParam(name = "meta-data") String
metadata` controller method argument. However, you would probably prefer to accept a metadata` controller method argument. However, you would probably prefer to accept a
strongly typed object initialized from the JSON formatted data in the body of the strongly typed object initialized from the JSON formatted data in the body of the
request part, very similar to the way `@RequestBody` converts the body of a request part, very similar to the way `@RequestBody` converts the body of a
@ -3879,9 +3879,9 @@ multipart:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@PostMapping("/someUrl") @PostMapping(path = "/someUrl")
public String onSubmit(**@RequestPart("meta-data") MetaData metadata, public String onSubmit(**@RequestPart(name = "meta-data") MetaData metadata,
@RequestPart("file-data") MultipartFile file**) { @RequestPart(name = "file-data") MultipartFile file**) {
// ... // ...
@ -3889,7 +3889,7 @@ multipart:
---- ----
Notice how `MultipartFile` method arguments can be accessed with `@RequestParam` or with Notice how `MultipartFile` method arguments can be accessed with `@RequestParam` or with
`@RequestPart` interchangeably. However, the `@RequestPart("meta-data") MetaData` method `@RequestPart` interchangeably. However, the `@RequestPart(name = "meta-data") MetaData` method
argument in this case is read as JSON content based on its `'Content-Type'` header and argument in this case is read as JSON content based on its `'Content-Type'` header and
converted with the help of the `MappingJackson2HttpMessageConverter`. converted with the help of the `MappingJackson2HttpMessageConverter`.
@ -4493,7 +4493,7 @@ in responses like this:
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@GetMapping("/book/{id}") @GetMapping(path = "/book/{id}")
public ResponseEntity<Book> showBook(@PathVariable Long id) { public ResponseEntity<Book> showBook(@PathVariable Long id) {
Book book = findBook(id); Book book = findBook(id);

View File

@ -1774,7 +1774,7 @@ handler method being defined like so...
@Controller @Controller
public class XsltController { public class XsltController {
@RequestMapping("/") @RequestMapping(path = "/")
public String home(Model model) throws Exception { public String home(Model model) throws Exception {
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

View File

@ -1411,7 +1411,7 @@ type, for example:
this.template = template; this.template = template;
} }
@RequestMapping(path="/greetings", method=POST) @RequestMapping(path = "/greetings", method=POST)
public void greet(String greeting) { public void greet(String greeting) {
String text = "[" + getTimestamp() + "]:" + greeting; String text = "[" + getTimestamp() + "]:" + greeting;
this.template.convertAndSend("/topic/greetings", text); this.template.convertAndSend("/topic/greetings", text);