{"id":2065,"date":"2026-01-19T02:38:05","date_gmt":"2026-01-18T13:38:05","guid":{"rendered":"https:\/\/www.ronella.xyz\/?p=2065"},"modified":"2026-01-19T02:38:05","modified_gmt":"2026-01-18T13:38:05","slug":"mapstruct-imports-pure-java-code","status":"publish","type":"post","link":"https:\/\/www.ronella.xyz\/?p=2065","title":{"rendered":"MapStruct Imports: Pure Java Code"},"content":{"rendered":"<p>MapStruct's <code>imports<\/code> attribute brings external types into scope for generated mappers. This guide focuses purely on the working code demonstrating imports in action.<\/p>\n<h2>Domain Model<\/h2>\n<p><strong>Abstract base entity:<\/strong><\/p>\n<pre><code class=\"language-java\">package com.example.domain;\n\npublic abstract class AbstractBaseEntity {\n    private Long id;\n\n    public Long getId() { return id; }\n    public void setId(Long id) { this.id = id; }\n\n    public abstract String getStatus();\n}<\/code><\/pre>\n<p><strong>Source entity:<\/strong><\/p>\n<pre><code class=\"language-java\">package com.example.domain;\n\npublic class UserEntity extends AbstractBaseEntity {\n    private String username;\n    private String email;\n\n    public String getUsername() { return username; }\n    public void setUsername(String username) { this.username = username; }\n\n    public String getEmail() { return email; }\n    public void setEmail(String email) { this.email = email; }\n\n    @Override\n    public String getStatus() { return &quot;ACTIVE&quot;; }\n}<\/code><\/pre>\n<p><strong>Target DTO:<\/strong><\/p>\n<pre><code class=\"language-java\">package com.example.dto;\n\npublic class UserDto {\n    private Long id;\n    private String username;\n    private String email;\n    private String statusInfo;\n\n    \/\/ getters\/setters\n    public Long getId() { return id; }\n    public void setId(Long id) { this.id = id; }\n\n    public String getUsername() { return username; }\n    public void setUsername(String username) { this.username = username; }\n\n    public String getEmail() { return email; }\n    public void setEmail(String email) { this.email = email; }\n\n    public String getStatusInfo() { return statusInfo; }\n    public void setStatusInfo(String statusInfo) { this.statusInfo = statusInfo; }\n\n    @Override\n    public String toString() {\n        return &quot;UserDto{id=&quot; + id + &quot;, username=&#039;&quot; + username + &quot;&#039;, statusInfo=&#039;&quot; + statusInfo + &quot;&#039;}&quot;;\n    }\n}<\/code><\/pre>\n<h2>Mapper with Imports<\/h2>\n<pre><code class=\"language-java\">package com.example.mapper;\n\nimport com.example.dto.UserDto;\nimport com.example.domain.UserEntity;\nimport org.mapstruct.Mapper;\nimport org.mapstruct.Mapping;\nimport java.util.List;\n\n@Mapper(imports = com.example.domain.AbstractBaseEntity.class)\npublic interface UserMapper {\n\n    @Mapping(target = &quot;id&quot;, source = &quot;id&quot;)\n    @Mapping(target = &quot;username&quot;, source = &quot;username&quot;)\n    @Mapping(target = &quot;email&quot;, source = &quot;email&quot;)\n    @Mapping(target = &quot;statusInfo&quot;, expression = &quot;java( ((AbstractBaseEntity) entity).getStatus() + \\&quot; (processed)\\&quot;)&quot;)\n    UserDto toDto(UserEntity entity);\n\n    List&lt;UserDto&gt; toDtos(List&lt;UserEntity&gt; entities);\n}<\/code><\/pre>\n<h2>Usage Code<\/h2>\n<pre><code class=\"language-java\">package com.example.demo;\n\nimport com.example.domain.UserEntity;\nimport com.example.dto.UserDto;\nimport com.example.mapper.UserMapper;\nimport org.mapstruct.factory.Mappers;\n\npublic class MapStructDemo {\n    private static final UserMapper MAPPER = Mappers.getMapper(UserMapper.class);\n\n    public static void main(String[] args) {\n        UserEntity entity = new UserEntity();\n        entity.setId(42L);\n        entity.setUsername(&quot;john_doe&quot;);\n        entity.setEmail(&quot;john@example.com&quot;);\n\n        UserDto dto = MAPPER.toDto(entity);\n        System.out.println(&quot;Mapped DTO: &quot; + dto);\n    }\n}<\/code><\/pre>\n<h2>Generated Code Insight<\/h2>\n<p>MapStruct generates <code>UserMapperImpl<\/code> with automatic import:<\/p>\n<pre><code class=\"language-java\">package com.example.mapper;\n\nimport com.example.domain.AbstractBaseEntity; \/\/ Added by imports attribute\nimport com.example.domain.UserEntity;\nimport com.example.dto.UserDto;\nimport java.util.ArrayList;\nimport java.util.List;\nimport javax.annotation.processing.Generated;\n\n@Generated(\n    value = &quot;org.mapstruct.ap.MappingProcessor&quot;,\n    comments = &quot;version: 1.6.3, compiler: IncrementalProcessingEnvironment from gradle-language-java-9.2.0.jar, environment: Java 25 (Oracle Corporation)&quot;\n)\npublic class UserMapperImpl implements UserMapper {\n\n    @Override\n    public UserDto toDto(UserEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        UserDto userDto = new UserDto();\n\n        userDto.setId( entity.getId() );\n        userDto.setUsername( entity.getUsername() );\n        userDto.setEmail( entity.getEmail() );\n\n        userDto.setStatusInfo( ((AbstractBaseEntity) entity).getStatus() + &quot; (processed)&quot; );\n\n        return userDto;\n    }\n\n    @Override\n    public List&lt;UserDto&gt; toDtos(List&lt;UserEntity&gt; entities) {\n        if ( entities == null ) {\n            return null;\n        }\n\n        List&lt;UserDto&gt; list = new ArrayList&lt;UserDto&gt;( entities.size() );\n        for ( UserEntity userEntity : entities ) {\n            list.add( toDto( userEntity ) );\n        }\n\n        return list;\n    }\n}\n<\/code><\/pre>\n<h2>Why Imports Are Required<\/h2>\n<p><strong>\u274c Without <code>imports<\/code> attribute:<\/strong><\/p>\n<pre><code class=\"language-java\">\/\/ GENERATED CODE FAILS TO COMPILE:\n\/\/ error: cannot find symbol\n\/\/ symbol: class AbstractBaseEntity\n\/\/ ((AbstractBaseEntity) entity).getStatus()<\/code><\/pre>\n<p><strong>\u2705 With <code>imports = AbstractBaseEntity.class<\/code>:<\/strong><\/p>\n<pre><code class=\"language-java\">\/\/ GENERATED CODE WORKS PERFECTLY:\n\/\/ import com.example.domain.AbstractBaseEntity;\n\/\/ ((AbstractBaseEntity) entity).getStatus() \u2713<\/code><\/pre>\n<h2>Multiple Imports Pattern<\/h2>\n<pre><code class=\"language-java\">@Mapper(imports = { \n    com.example.domain.AbstractBaseEntity.class,\n    java.time.LocalDateTime.class \n})\npublic interface AdvancedUserMapper {\n\n    @Mapping(target = &quot;createdAt&quot;, expression = &quot;java(LocalDateTime.now())&quot;)\n    @Mapping(target = &quot;fullInfo&quot;, expression = &quot;java(entity.getUsername() + \\&quot; &lt;\\&quot; + ((AbstractBaseEntity)entity).getStatus() + \\&quot;&gt;\\&quot;)&quot;)\n    UserDto toDto(UserEntity entity);\n}<\/code><\/pre>\n<p>The <code>imports<\/code> attribute eliminates compilation errors when mappings reference types across packages or inheritance hierarchies.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>MapStruct&#8217;s imports attribute brings external types into scope for generated mappers. This guide focuses purely on the working code demonstrating imports in action. Domain Model Abstract base entity: package com.example.domain; public abstract class AbstractBaseEntity { private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[91],"tags":[],"_links":{"self":[{"href":"https:\/\/www.ronella.xyz\/index.php?rest_route=\/wp\/v2\/posts\/2065"}],"collection":[{"href":"https:\/\/www.ronella.xyz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ronella.xyz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ronella.xyz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ronella.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2065"}],"version-history":[{"count":1,"href":"https:\/\/www.ronella.xyz\/index.php?rest_route=\/wp\/v2\/posts\/2065\/revisions"}],"predecessor-version":[{"id":2066,"href":"https:\/\/www.ronella.xyz\/index.php?rest_route=\/wp\/v2\/posts\/2065\/revisions\/2066"}],"wp:attachment":[{"href":"https:\/\/www.ronella.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ronella.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ronella.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}