도저에서 nullpointerexception을 얻지 않고 값을 값에 매핑하는 방법

StackOverflow https://stackoverflow.com/questions/1407041

  •  05-07-2019
  •  | 
  •  

문제

도저를 사용하여 두 객체를 매핑하는데 다음과 같습니다.

/**
/* 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를 설정하지 않으면 (class1.setid ()를 호출하여) 결과는 Dozer의 NullPointerException입니다. 나는 이것이 get ( "id")가 null이 될 때 맞다는 것을 이해합니다.

물론 Null을 확인하고 -1 또는 0 등을 반환하여 이것을 해결할 수 있습니다.

문제는 이것이 컴파일 타임 오류가 아닌 런타임 오류가된다는 것입니다. 나는 이것을 올바르게 해결하는 것을 선호합니다.

이제 나는 읽었다 map-null = "false"를 수행하여 null을 건너 뛸 수 있다는 Dozer 문서,하지만 나는 이것을 일할 수 없었다 ...

제안이 있습니까?

도움이 되었습니까?

해결책

나는 문제가 도저에 있지 않다고 믿는다.

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

(정수) get ( "id")는 메소드의 리턴 유형이 "int"이기 때문에 int로 암시 적으로 캐스팅됩니다.

이것은 대부분의 경우에 작동합니다 ... 결과가 null 인 경우를 제외하고,이 경우 int가 null이 될 수 없기 때문에 nullpointerexception을 얻습니다.

이로 인해 숨겨진 nullpointerexceptions ... 자세한 내용은 여기 : http://www.theserverside.com/blogs/thread.tss?thread_id=41731

이를 해결하려면 여러 가지 선택이 있습니다.

  • Class1 및 Class2에 실제로 NULL ID가 포함될 수있는 경우, 원시 INT 대신 정수를 얻거나 설정하기 위해 getters/setter를 수정하려고합니다.

  • Class1과 Class2가 모두 Null ID를 포함하지 않아야하고 이것이 클래스 불변으로 간주되면 Getter/Setter의 원시 int 유형을 다음 중 하나로 유지할 수 있습니다.

    • 생성자의 특정 값 (예 : 0)으로 초기화하여 Get ( "ID")가 널이되지 않도록하고 아무것도 NULL로 설정할 수 없는지 확인하십시오.
    • 또는 getId ()가 null이면 기본값을 반환하고 말한대로 getter에 null 체크를 추가하도록 결정하십시오.
  • Class1에 NULL ID가있을 수 있지만 Class2가 그렇지 않을 수있는 경우 Class1의 Getters와 Setter가 int Primitive 대신 Integer 유형을 사용해야하며 소스 필드가 NULL 일 때 기본값을 반환하는 Dozer CustomConverter를 작성해야합니다.

문안 인사


편집] 여기에 Dozer가 요청할 때 매핑 널을 무시한다는 것을 보여주는 테스트 코드입니다.

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