如何使用mapStruct仅映射指定的字段?

时间:2018-03-28 06:27:44

标签: java-8 mapstruct

如果MapStruct具有相同的名称,则默认情况下映射源和目标的所有属性。虽然我们可以在@Mapping中使用ignore属性来省略任何字段映射。但那不是我想要的。我想控制映射策略。我要指定类似

的内容
@Mapper(STRATEGY=MAPPING_STRATEGY.SPECIFIED)
public interface EmployeeToEmployeeDTOMapper {
        @Mappings({
                   @Mapping(target="id", source="id"),
                   @Mapping(target="name", source="name")
                 })
        public EmployeeDTO employeeToEmployeeDTO (Employee emp);
}

现在,这个映射仅用于将id和name从源映射到destination。除非在映射注释中指定,否则不应映射其他字段。

2 个答案:

答案 0 :(得分:3)

您要查找的内容是#1392中的功能请求。有一个待处理的PR,因此它可以在下一个版本(1.3.0)中使用。最终的API尚未定义。按照问题和PR完成后通知

答案 1 :(得分:1)

从 MapStruct 1.3 开始,可以将 private void button2_Click(object sender, EventArgs e) // PLACING ORDERS { int rowcount; const string query = @" UPDATE Production.ProductInventory SET Quantity -= @qty WHERE ProductId = @productId AND Quantity >= @qty; "; using (SqlConnection con = new SqlConnection(Properties.Settings.ConnectionString)) using (SqlCommand cmd1 = new SqlCommand(query,con)) { cmd1.Parameters.Add("@productId", SqlDbType.Int).Value = int.Parse(textBox1.Text); cmd1.Parameters.Add("@qty", SqlDbType.Int).Value = qty; con.Open(); rowcount = cmd.ExecuteNonQuery(); } if(rowcount == 0) { MessageBox.Show("Unfortunately we are not able to provide you with the amount you want", "Oops!", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } 注释添加到映射方法中以实现此结果:

@BeanMapping(ignoreByDefault = true)

每个 public interface EmployeeToEmployeeDTOMapper { @BeanMapping(ignoreByDefault = true) @Mapping(target="id", source="id") @Mapping(target="name", source="name") EmployeeDTO employeeToEmployeeDTO(Employee emp); } 注释元素的 the Javadocs

<块引用>

默认忽略所有映射。所有映射都必须手动定义。不会发生自动映射。不会对缺少的目标属性发出警告。