Загрузка файла с помощью службы Джерси через RESTfull и настройка ресурса не может быть изменена?
@Path("file.upload")
public class UploadFileService {
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileDetail) {
System.out.println("-----------------UploadFileService------------------1.");
// Should we use a disk or DB? Decided to use DISK
// Path should be read from properties-files
String uploadedFileLocation = "//uploaded/" + fileDetail.getFileName();
// save it
writeToFile(uploadedInputStream, uploadedFileLocation);
String output = "File uploaded to : " + uploadedFileLocation;
// All went OK
return Response.status(200).entity(output).build();
}
WARNING: No injection source found for a parameter of type public javax.ws.rs.core.Response com.insame.service.UploadFileService.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at index 0.
SEVERE: WebModule[/insame]StandardWrapper.Throwable
org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.
[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response com.insame.service.UploadFileService.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=MethodHandler{handlerClass=class com.insame.service.UploadFileService, handlerConstructors=[[email protected]]}, handlingMethod=public javax.ws.rs.core.Response com.insame.service.UploadFileService.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=file, defaultValue=null], Parameter [type=class com.sun.jersey.core.header.FormDataContentDisposition, source=file, defaultValue=null]], responseType=class javax.ws.rs.core.Response}, nameBindings=[]}']
at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:410)
at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:157)
at org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:280)
at org.glassfish.jersey.internal.Errors$2.call(Errors.java:289)
at org.glassfish.jersey.internal.Errors$2.call(Errors.java:286)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:286)
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:277)
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:262)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
Я реализовал тестовое обслуживание, подобное этому в UploadFileService
:
@GET
@Path("count")
@Produces("text/plain")
public String countREST() {
return "1 one 1";
}
и я получил это исключение для журнала:
FINE: [Web-Security] hasResource perm: ("javax.security.jacc.WebResourcePermission"
"/webresources/file.upload/count" "GET")
SEVERE: WebModule[/insame]StandardWrapper.Throwable
java.lang.IllegalStateException: The resource configuration is not modifiable in this context.
at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:257)
WARNING: StandardWrapperValve[com.insame.service.ApplicationConfig]: Allocate exception for servlet com.insame.service.ApplicationConfig
java.lang.IllegalStateException: The resource configuration is not modifiable in this context.
at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:257)
at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:205)
at org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:435)
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:261)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349)
Окружающая среда
- Netbeans7.3.1
- Glassfish 4.0
- Джерси 2 с Glassfish 4.0
Ответы
Ответ 1
Чтобы использовать multipart в приложении для вашего Джерси, вам необходимо зарегистрировать MultiPartFeature в своем приложении, то есть:
public class ApplicationConfig extends Application {
public Set<Class<?>> getClasses() {
final Set<Class<?>> resources = new HashSet<Class<?>>();
// Add your resources.
resources.add(UploadFileService.class);
// Add additional features such as support for Multipart.
resources.add(MultiPartFeature.class);
return resources;
}
}
Для получения дополнительной информации см. раздел Multipart в Руководстве пользователя Jersey.
Во второй проблеме, с которой вы столкнулись, попробуйте перезагрузить сервер GlassFish, я не уверен, как NetBeans перезагружают приложение в Джерси после изменения (если это не поможет, отправьте сообщение ApplicationConfig
).
Ответ 2
У меня была такая же проблема и я хотел избежать создания настраиваемого класса приложения. Это не очень хорошо документировано, но если вы хотите добавить функциональность Multipart, все, что вам нужно сделать, это добавить это в свой конфигурационный файл web.xml jersey:
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
</init-param>
Я также добавил файл loggingfilter.
Ответ 3
Если вы используете серфинг причала и сервлет, вы можете решить эту проблему, добавив следующий код в свой основной класс, где вы запустили сервер причала,
ServletHolder jerseyServlet = context.addServlet( org.glassfish.jersey.servlet.ServletContainer.class, "/*" ); jerseyServlet.setInitOrder(0);
// Tells the Jersey Servlet which REST service/classes to load.
jerseyServlet
.setInitParameter(
"jersey.config.server.provider.classnames",
<Your entry point class canonical name>
+ ";org.glassfish.jersey.media.multipart.MultiPartFeature");
Ответ 4
Простое разъяснение
Используйте
import org.glassfish.jersey.media.multipart.MultiPartFeature
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
Не
com.sun.jersey.*
Работал для меня только при использовании org.glassfish.jersey.media.multipart.*
В ApplicationConfig просто зарегистрируйте MultiPartFeature как
import org.glassfish.jersey.media.multipart.MultiPartFeature;
@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
resources.add(UploadFileService.class);
resources.add(MultiPartFeature.class);
return resources;
}
}
Ответ 5
Я использую Jersey 1.9.1. org.glassfish...... хорошо работает с Джерси 2. Для Джерси 1 вам лучше использовать классы com.sun...
Ответ 6
Вы можете использовать эквивалент @FormDataParam ( "file" ) для FormDataMultiPart, если хотите, используя аннотацию.
Используется как приведенный ниже пример кода:
public Response uploadFile( **@FormDataParam("file")** InputStream fileInputStream,
@FormDataParam("file") FormDataContentDisposition contentDispositionHeader) {