[SPRING] JerseyTest에서 Spring-Jersey 응용 프로그램에 대한 자원 모델 유효성 검증 실패
SPRINGJerseyTest에서 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.참고 : 대부분이 답변은 모든 @XxxParam 주석 매개 변수에 적용됩니다.
참고 : 대부분이 답변은 모든 @XxxParam 주석 매개 변수에 적용됩니다.
PointDto 매개 변수가 문제 인 것 같습니다.
public UnitDto getUnits(@QueryParam("contains") @NotNull PointDto point)
쿼리 매개 변수는 문자열입니다. Jersey는 String을 int, boolean, Date 등의 기본 유형으로 변환하는 기능을 가지고 있지만 그 문자열에서 PointDto를 작성하는 방법을 알지 못합니다. 그렇다고 맞춤 유형을 사용할 수 없다는 의미는 아닙니다. 우리는 몇 가지 규칙을 따라야합니다.
이 대답에 표시된 정보는 @QueryParam의 javadoc에 있습니다.
from https://stackoverflow.com/questions/36129764/resource-model-validation-failure-in-jerseytest-for-spring-jersey-application by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 보안 OAuth2에서 커스텀 userDetailsService 주입 문제 (0) | 2019.05.17 |
---|---|
[SPRING] 스프링에서 인스턴스화에 대한 자동 와이어 링 (0) | 2019.05.17 |
[SPRING] Jpa 및 Hibernate는 DB에서 비동기 적으로 변경되는 데이터를로드합니까? (0) | 2019.05.17 |
[SPRING] java.lang.NoClassDefFoundError : org / springframework / core / io / ResourceLoader (0) | 2019.05.17 |
[SPRING] JSTL을 사용하여지도의 키에 따라 여러 테이블을 표시하는 방법? (0) | 2019.05.17 |