복붙노트

[SPRING] JerseyTest에서 Spring-Jersey 응용 프로그램에 대한 자원 모델 유효성 검증 실패

SPRING

JerseyTest에서 Spring-Jersey 응용 프로그램에 대한 자원 모델 유효성 검증 실패

주석 달린 Spring-Jersey 응용 프로그램이 있습니다. JerseyTest를 사용하여 컨트롤러에 대한 단위 테스트를 설정하려고합니다. 알아낼 수없는 테스트를 실행할 때 다음과 같은 오류가 발생합니다. 나는 무엇을 놓쳤는가?

SEVERE: Following issues have been detected: 
WARNING: No injection source found for a parameter of type public com.example.services.dto.UnitDto com.example.apis.UnitResource.getUnits(com.example.services.dto.PointDto) throws com.example.exceptions.PointOutsideBounds at index 2.

Validation of the application resource model has failed during application initialization.
[[FATAL] No injection source found for a parameter of type public com.example.services.dto.UnitDto com.example.apis.UnitResource.getUnits(com.example.services.dto.PointDto) throws com.example.exceptions.PointOutsideBounds at index 2.; source='ResourceMethod{httpMethod=GET, consumedTypes=[], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class com.example.apis.UnitResource, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@31a5870e]}, definitionMethod=public com.example.services.dto.UnitDto com.example.apis.UnitResource.getUnits(com.example.services.dto.PointDto) throws com.example.exceptions.PointOutsideBounds, parameters=[Parameter [type=class com.example.services.dto.PointDto, source=contains, defaultValue=null]], responseType=class com.example.services.dto.UnitDto}, nameBindings=[]}']
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:555)

컨트롤러 클래스는 다음과 같습니다.

@Component
@Path("/app/units")
public class UnitResource {
    @Context
    private UriInfo uriInfo;
    @Context
    private Request request;

    @Inject
    private UnitService unitService;

    @Inject
    public UnitResource(@Named("UnitService") UnitService unitService) {
        this.unitService = unitService;
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Timed(absolute = true, name = "getUnitForPoint")
    public UnitDto getUnits(@QueryParam("contains") @NotNull PointDto point) throws PointOutsideBounds {
        return unitService.getUnitForPoint(point);
    }
}

테스트 클래스는 다음과 같습니다.

public class UnitResourceTest extends JerseyTest {

    @Mock
    private UnitService unitService;

    @Override
    protected ResourceConfig configure() {
        ResourceConfig rc = new ResourceConfig()
        //      .register(new UnitResource(Mockito.mock(UnitService.class))) -- has the same effect
                .register(UnitResource.class)
                .property("contextConfig", new AnnotationConfigApplicationContext(ApplicationConfiguration.class));

        enable(TestProperties.LOG_TRAFFIC);
        enable(TestProperties.DUMP_ENTITY);
        forceSet(TestProperties.CONTAINER_PORT, "0");

        return rc;
    }

    @Before
    public void setUp() throws Exception {
        super.setUp();
        initMocks(this);
    }

    @Override
    protected TestContainerFactory getTestContainerFactory() {
        return new InMemoryTestContainerFactory();
    }

    @Test
    public void testGetUnit() throws PointOutsideBounds {

        Response response = target()
                .path("/app/units")
                .queryParam("contains", new Point(0.0,0.0).toJson())
                .request(MediaType.APPLICATION_JSON_TYPE)
                .get();

        assertThat(response.getStatus(), is(Response.Status.OK));
    }
}

응용 프로그램 구성 클래스는 다음과 같습니다.

@Configuration
@ComponentScan("com.example")
public class ApplicationConfiguration {
    @Bean(name="UnitService")
    public UnitService unitService() {
        return new UnitService();
    }
}

테스트 구성에 대한 My Gradle 의존성은 다음과 같습니다.

dependencies {
    // Using junit-dep package to get junit without hamcrest dependency
    testCompile("junit:junit-dep:4.8.2")
    testCompile("org.hamcrest:hamcrest-all:1.3")
    testCompile("org.mockito:mockito-all:1.8.4")
    testCompile ('org.glassfish.jersey.test-framework:jersey-test-framework-core:2.22.2')
    testCompile('org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-inmemory:2.22.2')
}

configurations {
    testCompile.exclude group: 'org.glassfish.jersey.ext', module: 'jersey-spring3'
}

나는 이것을 발견했지만 내 문제를 해결하지 못했습니다.

해결법

  1. ==============================

    1.참고 : 대부분이 답변은 모든 @XxxParam 주석 매개 변수에 적용됩니다.

    참고 : 대부분이 답변은 모든 @XxxParam 주석 매개 변수에 적용됩니다.

    PointDto 매개 변수가 문제 인 것 같습니다.

    public UnitDto getUnits(@QueryParam("contains") @NotNull PointDto point)
    

    쿼리 매개 변수는 문자열입니다. Jersey는 String을 int, boolean, Date 등의 기본 유형으로 변환하는 기능을 가지고 있지만 그 문자열에서 PointDto를 작성하는 방법을 알지 못합니다. 그렇다고 맞춤 유형을 사용할 수 없다는 의미는 아닙니다. 우리는 몇 가지 규칙을 따라야합니다.

    이 대답에 표시된 정보는 @QueryParam의 javadoc에 있습니다.

  2. from https://stackoverflow.com/questions/36129764/resource-model-validation-failure-in-jerseytest-for-spring-jersey-application by cc-by-sa and MIT license