2013-08-28 3 views
2

Я получаю следующую ошибку, когда пытаюсь запустить мой тест после переноса проекта в сборку Maven. Тесты отлично работают с идентичным кодом с обычными дорожками сборки без Maven.С maven, Rest вызывает возврат 415 код ответа

com.sun.jersey.spi.container.ContainerRequest getEntity 
SEVERE: A message body reader for Java class java.util.Vector, and Java type java.util.Vector<Stuff>, and MIME media type application/json; charset=UTF-8 was not found. 
The registered message body readers compatible with the MIME media type are: 
application/json; charset=UTF-8 -> 
    com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App 
    com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App 
    com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App 
*/* -> 
    com.sun.jersey.core.impl.provider.entity.FormProvider 
    com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider 
    com.sun.jersey.core.impl.provider.entity.StringProvider 
    com.sun.jersey.core.impl.provider.entity.ByteArrayProvider 
    com.sun.jersey.core.impl.provider.entity.FileProvider 
    com.sun.jersey.core.impl.provider.entity.InputStreamProvider 
    com.sun.jersey.core.impl.provider.entity.DataSourceProvider 
    com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.ReaderProvider 
    com.sun.jersey.core.impl.provider.entity.DocumentProvider 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader 
    com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General 
    com.sun.jersey.core.impl.provider.entity.EntityHolderReader 
    com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General 
    com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General 

Мой тестовый сценарий:

@Test 
public void test() 
{ 
    try { 
     System.out.println(makeHttpRequest(new URL("http://localhost:8080/json/process"), "[]", DEFAULT_TIMEOUTS)); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

makeHttpRequest:

private static String makeHttpRequest(URL url, String body, int timeout) throws IOException { 
    HttpURLConnection conn = null; 
    OutputStream os = null; 
    InputStream is = null; 
    String response = null; 

    byte[] bytes = null; 
    try { 
     bytes = body.getBytes("UTF-8"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 

    try { 
     conn = (HttpURLConnection) (url.openConnection()); 
     conn.setReadTimeout(timeout); 
     conn.setConnectTimeout(timeout); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
     conn.setRequestProperty("Content-Length", "" + bytes.length); 
     conn.setDoOutput(true); 
     os = new DataOutputStream(conn.getOutputStream()); 
     os.write(bytes); 
     os.flush(); 
     os.close(); 
     StringWriter writer = new StringWriter(); 
     is = conn.getInputStream(); 
     IOUtils.copy(is, writer, "UTF-8"); 
     response = writer.toString(); 

     conn.disconnect(); 
    } finally { 
     if (os != null) { 
      try { 
       os.close(); 
      } catch (IOException e) { 
      } 
     } 
     if (is != null) { 
      try { 
       is.close(); 
      } catch (IOException e) { 
      } 
     } 
    } 
    return response; 
} 

JSONService:

@POST 
@Path("/process") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public Vector<Stuff> getLocations(Vector<Stuff> stuff) { 
    return processor.process(stuff); 
} 

.classpath:

<classpath> 
     <classpathentry kind="src" path="src"/> 
     <classpathentry kind="src" path="test"/> 
     <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal. debug.ui.launcher.StandardVMType/JavaSE-1.7"/> 
     <classpathentry kind="lib" path="lib/jetty-all-server-8.1.10.v20130312.jar"/> 
     <classpathentry kind="lib" path="lib/servlet-api-3.0.jar"/> 
     <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/> 
     <classpathentry kind="lib" path="lib/commons-io-2.4.jar"/> 
     <classpathentry kind="lib" path="lib/commons-lang3-3.1.jar"/> 
     <classpathentry kind="lib" path="lib/json-simple-1.1.1.jar"/> 
     <classpathentry kind="lib" path="lib/jersey-bundle-1.17.1.jar"/> 
     <classpathentry kind="lib" path="lib/org.objectweb.asm-3.1.0.jar"/> 
     <classpathentry kind="lib" path="lib/jackson-all-1.9.11.jar"/> 
     <classpathentry kind="lib" path="/trunk/server/thirdparty/lib/misc/log4j-1.2.15.jar"/> 
     <classpathentry kind="lib" path="/trunk/server/thirdparty/lib/tomcat7/tomcat-jdbc.jar"/> 
     <classpathentry kind="lib" path="lib/mysql-connector-java-5.1.26-bin.jar"/> 
     <classpathentry kind="lib" path="lib/tomcat-juli-7.0.37.jar"/> 
     <classpathentry kind="output" path="bin"/> 
</classpath> 

Maven dependecies:

<dependencies> 
    <dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>tomcat-jdbc</artifactId> 
     <version>8.0.0-RC1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-1.2-api</artifactId> 
     <version>2.0-beta8</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-core-asl</artifactId> 
     <version>1.9.13</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.13</version> 
    </dependency> 
    <dependency> 
     <groupId>com.googlecode.json-simple</groupId> 
     <artifactId>json-simple</artifactId> 
     <version>1.1.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.6</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty.aggregate</groupId> 
     <artifactId>jetty-all-server</artifactId> 
     <version>8.1.12.v20130726</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-bundle</artifactId> 
     <version>1.17.1</version> 
    </dependency> 
    <dependency> 
     <groupId>asm</groupId> 
     <artifactId>asm</artifactId> 
     <version>3.3.1</version> 
    </dependency> 
</dependencies> 
+0

Похож на проблему упаковки для меня. Вы упаковываете это в «войну»? Можете ли вы проверить объем ваших зависимостей Jackson/JSON-Simple и вручную проверить содержимое 'war', чтобы убедиться, что они включены? – chrylis

ответ

1

Добавить зависимость jersey-json. Он должен заботиться обо всем остальном.

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>1.17.1</version> 
</dependency> 

Объяснение: Maven обрабатывает обязательные зависимости для вас. Вам не нужно думать о том, какие банки нужно добавить, чтобы некоторая библиотека работала. jersey-json - необязательная зависимость, которая добавляет классы обработчика типов в путь класса. Maven не справляется с такой зависимостью, поскольку вы можете использовать другие пакеты.

+0

Спасибо. Как зависимости Maven отличаются от добавления двоичных файлов в classpath? Я совершенно новый с Maven и все еще довольно запутанный время от времени. – warbaque

+0

добавлено некоторое объяснение – allprog

Смежные вопросы