简体   繁体   中英

How to convert object of any class to a Map in Java?

In Spring MVC we have to use org.springframework.ui.Model instance to pass model to a view. It is not strongly-typed and we have to dynamically build the object like this:

model.addAttribute("departmentID", departmentID);
model.addAttribute("departmentName", departmentName);
model.addAttribute("employees", employees);

However, I came from ASP.NET MVC, where I passed strongly-typed objects to a view, and I had ViewDepartment class which had departmentID , departmentName and employees fields, and I simply passed instance to a view. Here it doesn't work, but I still need to use ViewDepartment class, because I occasionally send it as response to AJAX-requests.

So, to get this working in Spring MVC, I need to translate ViewDepartment object to instance of org.springframework.ui.Model , one way is to build org.springframework.ui.Model from HashMap :

Model.addAllAttributes(Map<String,?> attributes) 

The question is, how to build Map<String,?> attributes from instance of ViewDepartment class ? Creating HashMap object and manually setting each attribute from each property is not option, because it`s not DRY. I need some way to do this with any class, because I have other model classes in other controllers.

Or, may be, someone can tell another solution to this task, related to Spring MVC specifically.

you could use reflection to get a map of all fields and their values. Be aware, that this gets complicated, if you have nested structures, but with the given example it should work,

public Map<String, Object> toMap( Object object ) throws Exception
{
    Map<String, Object> map = new LinkedHashMap<>();
    for ( Field field : object.getClass().getDeclaredFields() )
    {
        field.setAccessible( true );
        map.put( field.getName(), field.get( object ) );
    }
    return map;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM