使用推土机,两个地图的对象,我有:

/**
/* This first class uses the GXT (ExtJS) framework
**/
Class1 extends BaseModelData
{
    public int getId()
    {
        return (Integer)get("id");
    }

    public void setId(int id)
    {
        set("id", id);
    }

    // more properties
}

Class2
{
    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    // more properties
}

如果我不设置Id在第一类(通过调用1级.setId())的结果是一个异常从推土机。我的理解是,这是正确的,因为获得("id")将空。

我当然可以解决这个放在一个检查空,并返回-1或0,或什么的。

问题是,这个然后成为一个运行错误而不是编纂时的错误。我更愿意解决这一正确。

现在,我读的 推土机文档,你可以拥有它跳过null做地图的空="虚假", 但我没得到这工作...

任何建议?

有帮助吗?

解决方案

我相信这个问题是不是在推土机,但是在隐藏自动拆箱在你吸气:

   public int getId()
{
    return (Integer)get("id");
}

(Integer)获得("id")是implicitely浇铸成一个int因为返回的你的方法是"int".

这将工作在大多数情况下...除了当的结果是空的,在这种情况下你会得到一个异常的,因为一个int可能永远不会空。

这种结果隐藏NullPointerExceptions...这里更多的信息: http://www.theserverside.com/blogs/thread.tss?thread_id=41731

要解决这个,你有个选择:

  • 如果1级和2级可能在事实上包含空id,你想要的修改你的干将/则制定者以get/set整数而不是原始的int.

  • 如果两1级和2级永远不应该包含空id,你认为这是一个类不变的,你可以保持原始int type在吸气/器和无论是:

    • 确保获得("id")将永远是空的,通过初始化的一些特定的价值(例如0)在构造),并确保没有什么可以将其设置为空。
    • 或决定,getId()将返回一个默认的价值,如果空,并添加一个空检查在吸气如你所说。
  • 如果1级可以有一个空id,但是2级可能不,你应该有1级的干将制定者和使用的整数类型,而不是一个int原始的,并且应创建一个推土机CustomConverter,返回一个默认值的时候源领域为空。

关于


[编辑] 这里是测试的代码显示,推土机不会忽略映射的空当要求:

src/com/test/dozer/Class1.java :

package com.test.dozer;

import com.extjs.gxt.ui.client.data.BaseModelData;

public class Class1 extends BaseModelData {

    // Notice the return type here: "Integer" and *not* int
    // Returning int throws a NullPointerException when get("id") is null!
    public Integer getId() {
        return (Integer) get("id");
    }

    public void setId(Integer id) {
        set("id", id);
    }

}

src/com/test/dozer/Class2.java :

package com.test.dozer;

public class Class2 {

    private int id;

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }
}

src/dozerMappingFile.xml :

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd">

  <configuration>
    <stop-on-errors>true</stop-on-errors>
    <date-format>MM/dd/yyyy HH:mm</date-format><!-- default dateformat will apply to all class maps unless the class mapping explicitly overrides it -->
    <wildcard>true</wildcard><!-- default wildcard policy that will apply to all class maps unless the class mapping explicitly overrides it -->
  </configuration>

  <mapping map-null="false">
    <class-a>com.test.dozer.Class1</class-a>
    <class-b>com.test.dozer.Class2</class-b>
  </mapping>

</mappings>

src/com/test/dozer/DozerTest.java :

package com.test.dozer;

import java.util.Arrays;

import junit.framework.Assert;

import org.dozer.DozerBeanMapper;
import org.junit.Before;
import org.junit.Test;

public class DozerTest {

    private DozerBeanMapper mapper;

    @Before
    public void setUp() {
        mapper = new DozerBeanMapper(Arrays.asList("dozerMappingFile.xml"));
    }

    /**
     * Verifies that class1's id is mapped into class2's id when not null.
     */
    @Test
    public void testMappingWhenIdNotNull() {
        Class1 class1 = new Class1();
        class1.setId(1);
        Class2 class2 = new Class2();
        class2.setId(2);

        mapper.map(class1, class2);

        Assert.assertEquals(1, class2.getId());
    }

    /**
     * Verifies that class2's id is not set to null when class1's id is null.
     */
    @Test
    public void testMappingWhenIdIsNull() {
        Class1 class1 = new Class1();
        Class2 class2 = new Class2();
        class2.setId(2);

        mapper.map(class1, class2);

        Assert.assertEquals(2, class2.getId());
    }

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top