休息服务 Jax-Rs - Post Multipart/data
Rest Service Jax-Rs - Post Multipart/data
我有一个 jax-rs REST 服务,使用 JEE 7(部署在 glassfish 4 中),它有一个方法来处理资源上的 HTTP POST:
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadVideo(
@FormDataParam("files") InputStream uploadedInputStream,
@FormDataParam("files") FormDataContentDisposition fileDetail) {
try {
//do something
} catch (Exception e) {
e.printStackTrace();
}
return toReturn.build();
}
我在 ejb 中的 pom.xml 是:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.22.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.22.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.22.2</version>
</dependency>
我用这些注释注册了其余资源:
@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> resources = new HashSet<>();
resources.add(MultiPartFeature.class);
return resources;
}
@Override
public Map<String, Object> getProperties() {
Map<String, Object> properties = new HashMap<>();
properties.put("jersey.config.server.provider.packages", "com.myBean.upload");
return properties;
}
}
当我尝试启动服务器时出现此错误:
java.lang.ClassCastException: Cannot cast
org.glassfish.jersey.ext.cdi1x.transaction.internal.TransactionalExceptionInterceptorProvider
to org.glassfish.jersey.server.spi.ComponentProvider
我已经读过这个问题 :Jersey 2 injection source for multipart formdata and How can I define a JAX-RS service that processes multi-part data in JEE? 但我找不到解决方案。有什么建议吗?
-产生日志
WARN: WELD-000411: Observer method [BackedAnnotatedMethod]
org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes
ProcessAnnotatedType, BeanManager) receives events for all
annotated types. Consider restricting events using @WithAnnotations or
a generic type with bounds. WARN: WELD-000411: Observer method
[BackedAnnotatedMethod] private
org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider.processAnnotatedType(@Observes
ProcessAnnotatedType) receives events for all annotated types.
Consider restricting events using @WithAnnotations or a generic type
with bounds. WARN: WELD-000411: Observer method
[BackedAnnotatedMethod]
org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes
ProcessAnnotatedType, BeanManager) receives events for all
annotated types. Consider restricting events using @WithAnnotations or
a generic type with bounds. WARN: WELD-000411: Observer method
[BackedAnnotatedMethod] public
org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes
ProcessAnnotatedType) receives events for all annotated types.
Consider restricting events using @WithAnnotations or a generic type
with bounds. WARN: WELD-000411: Observer method
[BackedAnnotatedMethod] private
org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider.processAnnotatedType(@Observes
ProcessAnnotatedType) receives events for all annotated types.
Consider restricting events using @WithAnnotations or a generic type
with bounds. WARN: WELD-000411: Observer method
[BackedAnnotatedMethod] public
org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes
ProcessAnnotatedType) receives events for all annotated types.
Consider restricting events using @WithAnnotations or a generic type
with bounds.
终于找到解决办法了。
对于第一个问题:
Cannot cast
org.glassfish.jersey.ext.cdi1x.transaction.internal.TransactionalExceptionInterceptorProvider
to org.glassfish.jersey.server.spi.ComponentProvider
@peeskillet 给出的解决方案。
我真正的问题有点不同,因为我错过了用 Rest Resource 注册所有包。无论如何,我post这里是这个问题的解决方案:
@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> resources = new HashSet<Class<?>>();
resources.add(MultiPartFeature.class);
return resources;
}
@Override
public Map<String, Object> getProperties() {
Map<String, Object> properties = new HashMap<>();
String array[] = {"com. myBean.home","com. myBean.upload","com.bandyer.search","com.bandyer.mail"};
properties.put("jersey.config.server.provider.packages", array);
}
}
我有一个 jax-rs REST 服务,使用 JEE 7(部署在 glassfish 4 中),它有一个方法来处理资源上的 HTTP POST:
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadVideo(
@FormDataParam("files") InputStream uploadedInputStream,
@FormDataParam("files") FormDataContentDisposition fileDetail) {
try {
//do something
} catch (Exception e) {
e.printStackTrace();
}
return toReturn.build();
}
我在 ejb 中的 pom.xml 是:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.22.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.22.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.22.2</version>
</dependency>
我用这些注释注册了其余资源:
@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> resources = new HashSet<>();
resources.add(MultiPartFeature.class);
return resources;
}
@Override
public Map<String, Object> getProperties() {
Map<String, Object> properties = new HashMap<>();
properties.put("jersey.config.server.provider.packages", "com.myBean.upload");
return properties;
}
}
当我尝试启动服务器时出现此错误:
java.lang.ClassCastException: Cannot cast org.glassfish.jersey.ext.cdi1x.transaction.internal.TransactionalExceptionInterceptorProvider to org.glassfish.jersey.server.spi.ComponentProvider
我已经读过这个问题 :Jersey 2 injection source for multipart formdata and How can I define a JAX-RS service that processes multi-part data in JEE? 但我找不到解决方案。有什么建议吗?
-产生日志
WARN: WELD-000411: Observer method [BackedAnnotatedMethod] org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes ProcessAnnotatedType, BeanManager) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds. WARN: WELD-000411: Observer method [BackedAnnotatedMethod] private org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider.processAnnotatedType(@Observes ProcessAnnotatedType) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds. WARN: WELD-000411: Observer method [BackedAnnotatedMethod] org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes ProcessAnnotatedType, BeanManager) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds. WARN: WELD-000411: Observer method [BackedAnnotatedMethod] public org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes ProcessAnnotatedType) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds. WARN: WELD-000411: Observer method [BackedAnnotatedMethod] private org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider.processAnnotatedType(@Observes ProcessAnnotatedType) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds. WARN: WELD-000411: Observer method [BackedAnnotatedMethod] public org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes ProcessAnnotatedType) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
终于找到解决办法了。 对于第一个问题:
Cannot cast org.glassfish.jersey.ext.cdi1x.transaction.internal.TransactionalExceptionInterceptorProvider to org.glassfish.jersey.server.spi.ComponentProvider
@peeskillet 给出的解决方案。
我真正的问题有点不同,因为我错过了用 Rest Resource 注册所有包。无论如何,我post这里是这个问题的解决方案:
@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> resources = new HashSet<Class<?>>();
resources.add(MultiPartFeature.class);
return resources;
}
@Override
public Map<String, Object> getProperties() {
Map<String, Object> properties = new HashMap<>();
String array[] = {"com. myBean.home","com. myBean.upload","com.bandyer.search","com.bandyer.mail"};
properties.put("jersey.config.server.provider.packages", array);
}
}