У меня был существующий метод веб-службы Джерси, который принимает ряд параметров через метод Http POST, который предназначен для обработки данных стандартной формы, типа содержимого application/x-www-form-urlencoded; одним из этих параметров был список строк. Ниже приведен пример сигнатуры метода, которая у меня есть.
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createItem(
@FormParam("p1") long p1,
@FormParam("p2") String p2,
@FormParam("p3") List<String> p3,
@FormParam("p4") String p4,
@Context UriInfo uriInfo
) throws SQLException {
Это работало правильно, и когда несколько параметров p3 передаются в список, он правильно генерируется Джерси и передается в метод.
Теперь мне нужно было сделать альтернативную версию этого метода, которая принимала бы запрос из нескольких частей, чтобы вместе с существующими параметрами можно было загрузить и файл. Поэтому я создал очень похожую сигнатуру метода для обработки запросов, состоящих из нескольких частей, пример показан ниже.
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response createItemWithFile(
@FormDataParam("p1") long p1,
@FormDataParam("p2") String p2,
@FormDataParam("p3") List<String> p3,
@FormDataParam("p4") String p4,
@FormDataParam("file") InputStream inputStream,
@Context UriInfo uriInfo
) throws SQLException {
Я изменил аннотации FormParam на FormDataParam, так как считаю, что это необходимо при использовании данных, состоящих из нескольких частей. Я пытался вызвать этот метод из теста JUnit, используя RESTAssured для выполнения вызова (так же, как это было сделано для исходного метода), но я получаю следующую ошибку.
java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
Поместив некоторые точки останова в код Джерси, в некоторых точках, указанных в трассировке стека, кажется, что он определил правильный метод для вызова, но в списке параметров, которые он пытается ему передать, p3 опущен .
Есть ли что-то другое, что нужно сделать, чтобы поддерживать прием списка в качестве входных данных при работе с данными, состоящими из нескольких частей? Учитывая, что это необязательный параметр, я ожидал, что в любом случае его можно будет опустить, это относится к исходному методу.
Код RESTAAssured в тесте, используемом для вызова метода, выглядит следующим образом.
Response response = given()
.header("my_header", "xyz")
.param("p1", "8000040")
.param("p2", "sample string")
.param("p3", "first_value")
.param("p4", "abcde")
.multiPart("file", myFile1, inputStream)
.expect()
Я также пытался использовать formParam в тестовом коде RESTAssured вместо param, но получил тот же результат.
Заранее спасибо, буду признательна за любую помощь.
log()
сразу послеgiven()
и увидишь свой запрос. - person Alex Stybaev   schedule 14.06.2012