Попытка создать веб-сервис для загрузки файла - Джерси со встроенной Jetty
Я пытаюсь создать веб-сервис с помощью Maven. Я использовал DarchetypeArtifactId=maven-archetype-quickstart, и я создал экземпляры пристани в основном классе, и это работает
package com.rest.test;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
public class App {
public static void main(String[] args) throws Exception {
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
Server jettyServer = new Server(8080);
jettyServer.setHandler(context);
ServletHolder jerseyServlet = context.addServlet(
org.glassfish.jersey.servlet.ServletContainer.class, "/*");
jerseyServlet.setInitOrder(0);
// Tells the Jersey Servlet which REST service/class to load.
jerseyServlet.setInitParameter(
"jersey.config.server.provider.classnames",
UploadFileService.class.getCanonicalName());
try {
jettyServer.start();`enter code here`
jettyServer.join();
} finally {
jettyServer.destroy();
}
}
}
проблема связана с кодом в классе UploadFileService, какой пакет класса или зависимости я должен использовать?
Я пытался с "jersey-multipart.jar", но у меня был конфликт зависимости с Jetty.
Я также пытался использовать Servlet 3.0 API, но не смог заставить его работать со встроенным причалом.
Я нашел несколько примеров:
Попытка загрузить файл на сервер JAX-RS (джерси) - отличный пример, но это для сервера джерси
http://www.codejava.net/java-ee/servlet/java-file-upload-example-with-servlet-30-api - отличный пример, но это для сервера Tomcat
http://examples.javacodegeeks.com/enterprise-java/rest/jersey/jersey-file-upload-example/ - отличный пример, но это для веб-приложения
Я действительно ценю, если кто-нибудь может оказать какую-либо помощь или любую мелочь.
Заранее спасибо!
Примечание: он был помечен как дубликат peeskillet, ЭТО НЕ ДУБЛИРОВАНО! MULTIPART_FORM_DATA: не найден источник инъекции для параметра типа public javax.ws.rs.core.Response использует tomcat, и мой вопрос касается встроенной пристани. Единственное совпадение - это имя класса UploadFileService.class
всем привет
Я изменил класс, теперь у меня есть два класса JettyServer, где я устанавливаю сервер и UploadFile, где я пытаюсь управлять POST
package com.rest.test.restprj;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.server.ServerProperties;
public class JettyServer
{
public static void main(String[] args) throws Exception
{
Server jettyServer = new Server(8080);
// Create the ResourceHandler. It is the object that will actually handle the request for a given file. It is
// a Jetty Handler object so it is suitable for chaining with other handlers as you will see in other examples.
ResourceHandler resource_handler = new ResourceHandler();
// Configure the ResourceHandler. Setting the resource base indicates where the files should be served out of.
// In this example it is the current directory but it can be configured to anything that the jvm has access to.
resource_handler.setDirectoriesListed(true);
resource_handler.setWelcomeFiles(new String[]{ "./html/index.html" });
resource_handler.setResourceBase(".");
//Jersey ServletContextHandler
ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
ServletHolder jerseyServlet = servletContextHandler.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*");
jerseyServlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "com.rest.test.restprj");
// Add the ResourceHandler to the server.
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, servletContextHandler, new DefaultHandler() });
jettyServer.setHandler(handlers);
try {
jettyServer.start();
jettyServer.join();
} finally {
jettyServer.destroy();
}
}
}
Кажется, все в порядке с вышеуказанным классом. Но я запутался, что мне нужно, чтобы зарегистрировать MultiPartFeature. Я получил ошибку:
SEVERE: обнаружены следующие проблемы: ПРЕДУПРЕЖДЕНИЕ: не найден источник внедрения для параметра типа public javax.ws.rs.core.Response com.rest.test.restprj.UploadFile.postMsg(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) создает исключение java.lang.Exception с индексом 0.
@Path("/fileUpload")
public class UploadFile {
@POST
//@Consumes("multipart/form-data")
//@Consumes("image/jpeg")
@Produces("text/plain")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response postMsg (
@FormDataParam("file") InputStream stream,
@FormDataParam("file") FormDataContentDisposition fileDetail) throws Exception {
String uploadedFileLocation = "./" + fileDetail.getFileName();
// save it
writeToFile(stream, uploadedFileLocation);
String output = "File uploaded to : " + uploadedFileLocation;
final Application application = new ResourceConfig()
.packages("org.glassfish.jersey.examples.multipart")
.register(MultiPartFeature.class);
return Response.status(200).entity(output).type(MediaType.TEXT_PLAIN).build();
}
private void writeToFile(InputStream uploadedInputStream,
String uploadedFileLocation) {
try {
OutputStream out = new FileOutputStream(new File(
uploadedFileLocation));
int read = 0;
byte[] bytes = new byte[1024];
out = new FileOutputStream(new File(uploadedFileLocation));
while ((read = uploadedInputStream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}