2013-08-28 41 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的依賴條件:

<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依賴與向類路徑添加二進制文件有什麼不同?我對Maven完全陌生,有時還很困惑。 – warbaque

+0

增加了一些解釋 – allprog

相關問題