我有一个 RESTful Web 服务,使用 Drop Wizard 0.8.5 和 Jersey 2.21。我有一个资源类,其注释为:
@Path("/mysite/somepath")
这个类包含各种方法,例如@GETs、@PUTS等,都工作得很好。
现在,我有另一个用@Path("/mysite")
. 在此资源类中,我需要添加一些用路径注释的方法,如下所示:
@Path("/somepath/dothis")
@Path("/somepath/dothat")
Run Code Online (Sandbox Code Playgroud)
资源类都注册得很好。然而,当我调用第二个类时,我得到了 404,因为泽西岛似乎正在我的第一个类中寻找这些方法。除了更改我的 @Path 注释以避免这种命名冲突之外,还有其他方法可以解决此问题吗?
在球衣服务器中时,出现服务器 500 错误:
\n\n在服务器响应中,不\xc2\xb4t 有堆栈跟踪或一些信息。
在 Eclipse 控制台中,don\xc2\xb4t 有异常堆栈跟踪
我尝试捕获服务器中的异常并在控制台中打印跟踪,但没有任何反应
\n\n发生 500 服务器错误时如何获取堆栈跟踪?
\n我正在为我的 REST 应用程序编写 E2E 测试。因此,位于前端的测试调用已部署的后端,除了一个小问题之外,这一切工作得很好:当调用readEntity
接收到的方法时Response
,java.lang.ArrayStoreException
会发生一个。我的观察表明问题出在自己编写的约束注释中:
@Future
我已经为 Bean 验证编写了自己的约束注释,我的 POJO 使用此注释来验证 aLocalDateTime
是否在将来。我还提供了两个简单的接口,用作验证组:
public interface ExistingInstance extends Default {
}
Run Code Online (Sandbox Code Playgroud)
和
public interface NewInstance extends Default {
}
Run Code Online (Sandbox Code Playgroud)
当我在自定义约束注释中使用这些接口之一作为验证组时,如下所示:
public class Book {
@Future(groups=NewInstance.class)
private LocalDateTime validFrom;
private LocalDateTime validTo;
// Getters & Setters...
}
Run Code Online (Sandbox Code Playgroud)
我收到此异常:
java.lang.ArrayStoreException
at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:736)
at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:543)
at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:367)
at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:298)
at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:132)
at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:84)
at java.lang.reflect.AccessibleObject.getAnnotationsFromCache(AccessibleObject.java:313)
at java.lang.reflect.Field.declaredAnnotations(Field.java:1167)
at java.lang.reflect.Field.getDeclaredAnnotations(Field.java:1160)
at com.fasterxml.jackson.databind.introspect.AnnotatedFieldCollector._findFields(AnnotatedFieldCollector.java:86)
at com.fasterxml.jackson.databind.introspect.AnnotatedFieldCollector._findFields(AnnotatedFieldCollector.java:71)
at com.fasterxml.jackson.databind.introspect.AnnotatedFieldCollector.collect(AnnotatedFieldCollector.java:48)
at com.fasterxml.jackson.databind.introspect.AnnotatedFieldCollector.collectFields(AnnotatedFieldCollector.java:43) …
Run Code Online (Sandbox Code Playgroud) 我有一个带有 Jersey REST 端点的 Web 应用程序(war)。我正在与普罗米修斯/千分尺集成以生成指标。我在这里公开了“/metrics”端点
@Path("/metrics")
public class Metrics {
private static final PrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
static {
new JvmGcMetrics().bindTo(prometheusRegistry);
new JvmMemoryMetrics().bindTo(prometheusRegistry);
new JvmCompilationMetrics().bindTo(prometheusRegistry);
new JvmThreadMetrics().bindTo(prometheusRegistry);
}
@GET
public String getMetrics() {
return prometheusRegistry.scrape();
}
}
Run Code Online (Sandbox Code Playgroud)
我被困在如何生成 http 请求指标上。我找不到任何与获取这些指标相关的代码。有人可以帮我吗?
以下代码运行我的REST服务,但我的servlet过滤器永远不会被调用.有任何想法吗?
WebappContext webappContext = new WebappContext("grizzly web context", "");
FilterRegistration testFilterReg = webappContext.addFilter("TestFilter", TestFilter.class);
testFilterReg.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), "/*");
ResourceConfig rc = new ResourceConfig().register(MyResource.class);
HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(URI.create("http://localhost:8080/myapp/"), rc);
webappContext.deploy(httpServer);
Run Code Online (Sandbox Code Playgroud) http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/ 我正在按照本指南操作并遇到问题.我有一些问题.
所有的依赖都必须对应吗?我的项目有一些org.glassfish.jersey依赖项,本指南建议使用org.sun.jersey.我是否必须使用与此相同的版本进行更改?
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.16</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.16</version>
Run Code Online (Sandbox Code Playgroud)
我有这个错误
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 ***.***.****.common.dto.response.AbstractResponse ***.***.****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService.upload(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class ***.***.****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@90516e]}, definitionMethod=public ***.***.***.common.dto.response.AbstractResponse ***.***.*****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService.upload(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=file1, defaultValue=null], Parameter [type=class org.glassfish.jersey.media.multipart.FormDataContentDisposition, source=file1, defaultValue=null]], responseType=class ***.***.***.common.dto.response.AbstractResponse}, nameBindings=[]}']
Run Code Online (Sandbox Code Playgroud)
这是我的网络服务
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public AbstractResponse upload(@FormDataParam("file1") InputStream file1,
@FormDataParam("file1") FormDataContentDisposition filename1
) …
Run Code Online (Sandbox Code Playgroud)我正在使用托管在Google App Engine上的Java,Jetty和Jersey 2.18(现在最新).
假设我有这样的服务
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{userId}")
public Response getUser(@PathParam("userId") String userId)
{
...
}
Run Code Online (Sandbox Code Playgroud)
当我做:
return Response.ok()
.entity(user)
.build();
Run Code Online (Sandbox Code Playgroud)
我正确地收到了application/json内容类型和正文.但当我这样做时:
return Response
.status(404)
.entity(new ResponseModel(100, "user not found"))
.build();
Run Code Online (Sandbox Code Playgroud)
与返回任何4XX或5XX状态相同,我收到text/html内容类型以及此HTML正文:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>404 Not Found</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Not Found</h1>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
而不是我放入的对象.entity()
编辑:这是我的web.xml
<?xml version="1.0" encoding="utf-8"?>
<web-app
version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.mypackage.services;org.codehaus.jackson.jaxrs</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>
org.glassfish.jersey.server.gae.GaeFeature;
org.glassfish.jersey.server.mvc.jsp.JspMvcFeature;
org.glassfish.jersey.media.multipart.MultiPartFeature;
</param-value> …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将jax-rs响应序列化为json字符串.
来自服务器的响应是json,我从泽西客户端获得它:
Response resp = target.request().method("PUT", Entity.json(payloadBean))
Run Code Online (Sandbox Code Playgroud)
其中payloadBean是我的json请求.一切正常但我无法转换json字符串中的resp以便记录它.
如果我尝试:
String s = EntityUtils.toString((HttpEntity) resp.getEntity());
Run Code Online (Sandbox Code Playgroud)
我明白了:
org.glassfish.jersey.client.internal.HttpUrlConnector cannot be cast to org.apache.http.HttpEntity
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果我没有强制转换为HttpEntity,编译器说:
toString (org.apache.http.HttpEntity) in EntityUtils cannot be applied to (java.lang.Object).
Run Code Online (Sandbox Code Playgroud)
我的相关进口是:
import org.apache.http.HttpEntity;
import org.apache.http.util.EntityUtils;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我可以通过以下方式在jersey中上传文件:
@POST
@Consumes( MediaType.MULTIPART_FORM_DATA)
public void indexFile(
@FormDataParam("file") InputStream uploadedFile,
@FormDataParam("file") FormDataContentDisposition fileInfo){
System.out.println(fileInfo.getFileName());
DAO.indexFileToSolr(uploadedFile);
}
Run Code Online (Sandbox Code Playgroud)
这给了我该文件作为输入流。该文件包含以下格式的json对象数组:
[
{
id: 1,
title: "someTitle"
}
]
Run Code Online (Sandbox Code Playgroud)
我也有一个POJO / Java类,代表该对象,如下所示:
@XmlRootElement
public class MyObj{
private int id;
private String title;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
我jersey-media-moxy
用来在传入请求或传出响应时自动在POJO和JSON / XML之间进行转换。(我不需要为此编写任何代码,我只需要指定请求将为JSON格式,或者响应应为JSON,并且序列化/反序列化由处理即可jersey-media-moxy
。)
问题是,我无法在文件上载方法中指定此行为,我看不到告诉jersey或jersey-media-moxy
将文件序列化为Java对象的方法。
我找不到任何方法jersey-media-moxy
来实际读取InputStream并将其序列化为POJO。
注意:我可能可以jackson
用来读取json文件并创建Java对象列表,但我不太愿意这样做,因为首先需要另一个库(如果我可以使用jersey-media- Mosy),其次,我不确定是否可以通过简单的方式告诉泽西文件此文件包含Json对象,因此请对其进行反序列化。
jersey-2.0 ×10
java ×8
grizzly ×2
jax-rs ×2
jersey ×2
rest ×2
dropwizard ×1
glassfish ×1
jackson ×1
javax.ws.rs ×1
json ×1
maven ×1
micrometer ×1
prometheus ×1
reflection ×1