Close

Spring MVC - Auto generating names of Model attributes

[Last Updated: Sep 11, 2026]

A Model instance can add objects without a specified name by using the following methods:

Model addAttribute(Object attributeValue)
Model addAllAttributes(Collection<?> attributeValues)

The Model object auto-generates the attribute name and then forwards the call to addAttribute(String attributeName, Object attributeValue)



The following are the rules of the name generation strategy:

  • For an object that is not a collection, a short class name is generated. For example, for java.lang.String, 'string' will be generated.
  • For collections/arrays, 'List' is appended after the type of the elements it contains, e.g. 'stringList'. The collection/array must not be empty, because the logic uses the first element to determine its type.


Example

package com.logicbig.example;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Arrays;
import java.util.List;

@Controller
public class TheController {

    @RequestMapping("/")
    public String handleRequest (Model model) {
        String string1 = "my string value";
        model.addAttribute(string1);

        int i = 10;
        model.addAttribute(i);

        List<String> list = Arrays.asList("one", "two");
        model.addAttribute(list);
        return "myPage";
    }
}
myPage.jsp

src/main/webapp/WEB-INF/pages/myPage.jsp

<%@ page language="java"
    contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="fm"%>

<html>
  <body style="margin:15px;">

      <p>String value: ${string}</p>
      <p>int value: ${integer}</p>
      StringList:
      <fm:checkboxes path="stringList" items="${stringList}" />

  </body>
</html>


Output

To try examples, run embedded Jetty (configured in pom.xml of example project below):

mvn jetty:run
$ curl -s "http://localhost:8080/"



<html>
<body style="margin:15px;">

<p>String value: my string value</p>
<p>int value: 10</p>
StringList:
<span><input id="1" type="checkbox" value="one"/><label for="1">one</label></span><span><input id="2" type="checkbox" value="two"/><label for="2">two</label></span><input type="hidden" name="_" value="on"/>

</body>
</html>


If the same object type is populated multiple times in a single Model, an explicit attribute name should be used rather than relying on auto name generation.

Some developers prefer to use explicit names anyway, so that they have more control over attribute names. It's a good feature to use in simple cases, though.



The logic of name generation is actually delegated to Conventions#getVariableName(..). Here's a test to understand the auto-generation rules:

package com.logicbig.example;

import org.springframework.core.Conventions;
import java.util.*;

public class VariableNameTest {
    public static void main(String[] args) {

        Object obj = "test string";
        print(obj, "\"test string\"");

        obj = new String[]{"one", "two"};
        print(obj, "new String[]{\"one\", \"two\"};");

        obj = 5;
        print(obj, "5");

        obj = Integer.valueOf(5);
        print(obj, "Integer.valueOf(5)");

        obj = 'z';
        print(obj, "'z'");

        obj = Arrays.asList(1, 2, 3);
        print(obj, "Arrays.asList(1, 2, 3)");

        obj = new LinkedList<>(Arrays.asList(1, 2, 3));
        print(obj, "new LinkedList<>(Arrays.asList(1, 2, 3))");

        obj = new HashSet<>(Arrays.asList("1", "2"));
        print(obj, "new HashSet<>(Arrays.asList(\"1\", \"2\"))");

        obj = new HashMap<String, Integer>();
        print(obj, "new HashMap<String, Integer>()");

        obj = new LinkedHashMap<>();
        print(obj, "new LinkedHashMap<>()");

        obj = new TreeMap<>();
        print(obj, "new TreeMap<>()");

        obj = new MyNestedObject();
        print(obj, "MyNestedObject()");

        obj = new TheController();
        print(obj, "new TheController()");

        //a collection cannot be empty (map is ok)
        // following will throw IllegalArgumentException:

        // Set<Integer> integerTreeSet = new TreeSet<>();
        // name = Conventions.getVariableName(integerTreeSet);
        // print("Set<Integer> integerTreeSet = new TreeSet<>();", name)

    }

    private static void print(Object obj,
                              String declaration) {
        String name = Conventions.getVariableName(obj);
        System.out.printf("%40s: %s%n", declaration, name);
    }

    private static class MyNestedObject {
    }
}

Output

                           "test string": string
new String[]{"one", "two"};: stringList
5: integer
Integer.valueOf(5): integer
'z': character
Arrays.asList(1, 2, 3): integerList
new LinkedList<>(Arrays.asList(1, 2, 3)): integerList
new HashSet<>(Arrays.asList("1", "2")): stringList
new HashMap<String, Integer>(): hashMap
new LinkedHashMap<>(): linkedHashMap
new TreeMap<>(): treeMap
MyNestedObject(): myNestedObject
new TheController(): theController

Example Project

Dependencies and Technologies Used:

  • spring-webmvc 7.0.6 (Spring Web MVC)
     Version Compatibility: 3.2.9.RELEASE - 7.0.6Version List
    ×

    Version compatibilities of spring-webmvc with this example:

      javax.servlet-api:3.x
    • 3.2.9.RELEASE
    • 3.2.10.RELEASE
    • 3.2.11.RELEASE
    • 3.2.12.RELEASE
    • 3.2.13.RELEASE
    • 3.2.14.RELEASE
    • 3.2.15.RELEASE
    • 3.2.16.RELEASE
    • 3.2.17.RELEASE
    • 3.2.18.RELEASE
    • 4.0.0.RELEASE
    • 4.0.1.RELEASE
    • 4.0.2.RELEASE
    • 4.0.3.RELEASE
    • 4.0.4.RELEASE
    • 4.0.5.RELEASE
    • 4.0.6.RELEASE
    • 4.0.7.RELEASE
    • 4.0.8.RELEASE
    • 4.0.9.RELEASE
    • 4.1.0.RELEASE
    • 4.1.1.RELEASE
    • 4.1.2.RELEASE
    • 4.1.3.RELEASE
    • 4.1.4.RELEASE
    • 4.1.5.RELEASE
    • 4.1.6.RELEASE
    • 4.1.7.RELEASE
    • 4.1.8.RELEASE
    • 4.1.9.RELEASE
    • 4.2.0.RELEASE
    • 4.2.1.RELEASE
    • 4.2.2.RELEASE
    • 4.2.3.RELEASE
    • 4.2.4.RELEASE
    • 4.2.5.RELEASE
    • 4.2.6.RELEASE
    • 4.2.7.RELEASE
    • 4.2.8.RELEASE
    • 4.2.9.RELEASE
    • 4.3.0.RELEASE
    • 4.3.1.RELEASE
    • 4.3.2.RELEASE
    • 4.3.3.RELEASE
    • 4.3.4.RELEASE
    • 4.3.5.RELEASE
    • 4.3.6.RELEASE
    • 4.3.7.RELEASE
    • 4.3.8.RELEASE
    • 4.3.9.RELEASE
    • 4.3.10.RELEASE
    • 4.3.11.RELEASE
    • 4.3.12.RELEASE
    • 4.3.13.RELEASE
    • 4.3.14.RELEASE
    • 4.3.15.RELEASE
    • 4.3.16.RELEASE
    • 4.3.17.RELEASE
    • 4.3.18.RELEASE
    • 4.3.19.RELEASE
    • 4.3.20.RELEASE
    • 4.3.21.RELEASE
    • 4.3.22.RELEASE
    • 4.3.23.RELEASE
    • 4.3.24.RELEASE
    • 4.3.25.RELEASE
    • 4.3.26.RELEASE
    • 4.3.27.RELEASE
    • 4.3.28.RELEASE
    • 4.3.29.RELEASE
    • 4.3.30.RELEASE
    • 5.0.0.RELEASE
    • 5.0.1.RELEASE
    • 5.0.2.RELEASE
    • 5.0.3.RELEASE
    • 5.0.4.RELEASE
    • 5.0.5.RELEASE
    • 5.0.6.RELEASE
    • 5.0.7.RELEASE
    • 5.0.8.RELEASE
    • 5.0.9.RELEASE
    • 5.0.10.RELEASE
    • 5.0.11.RELEASE
    • 5.0.12.RELEASE
    • 5.0.13.RELEASE
    • 5.0.14.RELEASE
    • 5.0.15.RELEASE
    • 5.0.16.RELEASE
    • 5.0.17.RELEASE
    • 5.0.18.RELEASE
    • 5.0.19.RELEASE
    • 5.0.20.RELEASE
    • 5.1.0.RELEASE
    • 5.1.1.RELEASE
    • 5.1.2.RELEASE
    • 5.1.3.RELEASE
    • 5.1.4.RELEASE
    • 5.1.5.RELEASE
    • 5.1.6.RELEASE
    • 5.1.7.RELEASE
    • 5.1.8.RELEASE
    • 5.1.9.RELEASE
    • 5.1.10.RELEASE
    • 5.1.11.RELEASE
    • 5.1.12.RELEASE
    • 5.1.13.RELEASE
    • 5.1.14.RELEASE
    • 5.1.15.RELEASE
    • 5.1.16.RELEASE
    • 5.1.17.RELEASE
    • 5.1.18.RELEASE
    • 5.1.19.RELEASE
    • 5.1.20.RELEASE
    • 5.2.0.RELEASE
    • 5.2.1.RELEASE
    • 5.2.2.RELEASE
    • 5.2.3.RELEASE
    • 5.2.4.RELEASE
    • 5.2.5.RELEASE
    • 5.2.6.RELEASE
    • 5.2.7.RELEASE
    • 5.2.8.RELEASE
    • 5.2.9.RELEASE
    • 5.2.10.RELEASE
    • 5.2.11.RELEASE
    • 5.2.12.RELEASE
    • 5.2.13.RELEASE
    • 5.2.14.RELEASE
    • 5.2.15.RELEASE
    • 5.2.16.RELEASE
    • 5.2.17.RELEASE
    • 5.2.18.RELEASE
    • 5.2.19.RELEASE
    • 5.2.20.RELEASE
    • 5.2.21.RELEASE
    • 5.2.22.RELEASE
    • 5.2.23.RELEASE
    • 5.2.24.RELEASE
    • 5.2.25.RELEASE
    • 5.3.0
    • 5.3.1
    • 5.3.2
    • 5.3.3
    • 5.3.4
    • javax.servlet-api:4.x
    • 5.3.5
    • 5.3.6
    • 5.3.7
    • 5.3.8
    • 5.3.9
    • 5.3.10
    • 5.3.11
    • 5.3.12
    • 5.3.13
    • 5.3.14
    • 5.3.15
    • 5.3.16
    • 5.3.17
    • 5.3.18
    • 5.3.19
    • 5.3.20
    • 5.3.21
    • 5.3.22
    • 5.3.23
    • 5.3.24
    • 5.3.25
    • 5.3.26
    • 5.3.27
    • 5.3.28
    • 5.3.29
    • 5.3.30
    • 5.3.31
    • 5.3.32
    • 5.3.33
    • 5.3.34
    • 5.3.35
    • 5.3.36
    • 5.3.37
    • 5.3.38
    • 5.3.39
    • javax.* -> jakarta.*
      jakarta.servlet-api:6.x
      Java 17 min
    • 6.0.0
    • 6.0.1
    • 6.0.2
    • 6.0.3
    • 6.0.4
    • 6.0.5
    • 6.0.6
    • 6.0.7
    • 6.0.8
    • 6.0.9
    • 6.0.10
    • 6.0.11
    • 6.0.12
    • 6.0.13
    • 6.0.14
    • 6.0.15
    • 6.0.16
    • 6.0.17
    • 6.0.18
    • 6.0.19
    • 6.0.20
    • 6.0.21
    • 6.0.22
    • 6.0.23
    • 6.1.0
    • 6.1.1
    • 6.1.2
    • 6.1.3
    • 6.1.4
    • 6.1.5
    • 6.1.6
    • 6.1.7
    • 6.1.8
    • 6.1.9
    • 6.1.10
    • 6.1.11
    • 6.1.12
    • 6.1.13
    • 6.1.14
    • 6.1.15
    • 6.1.16
    • 6.1.17
    • 6.1.18
    • 6.1.19
    • 6.1.20
    • 6.1.21
    • 6.2.0
    • 6.2.1
    • 6.2.2
    • 6.2.3
    • 6.2.4
    • 6.2.5
    • 6.2.6
    • 6.2.7
    • 6.2.8
    • 6.2.9
    • 6.2.10
    • 6.2.11
    • 6.2.12
    • 6.2.13
    • 6.2.14
    • 6.2.15
    • 6.2.16
    • 6.2.17
    • 6.2.18
    • 6.2.19
    • 7.0.0
    • 7.0.1
    • 7.0.2
    • 7.0.3
    • 7.0.4
    • 7.0.5
    • 7.0.6

    Versions in green have been tested.

  • spring-test 7.0.6 (Spring TestContext Framework)
  • junit-jupiter-engine 6.0.3 (Module "junit-jupiter-engine" of JUnit)
  • jakarta.servlet-api 6.1.0 (Jakarta Servlet API documentation)
  • hamcrest 3.0 (Core API and libraries of hamcrest matcher framework)
  • JDK 25
  • Maven 3.9.11

Spring MVC - Auto generating names of Model attributes Select All Download
  • model-attribute-generated-names
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • TheController.java
          • webapp
            • WEB-INF
              • pages

    See Also

    Join