我正在尝试使用 REST 为客户端/服务器实现协议缓冲区。我仍然有点困惑是否需要以字节格式发送协议缓冲区请求?
我的意思是,在我的客户端代码中,我是否需要将对象序列化为字节数组?例如
protoRequest.build.toByteArray()
在服务器中,我需要c
@POST
@Consumes("application/octet-stream")
public byte[] processProtoRequest(byte[] protoRequest) {
ProtoRequest.Builder request = ProtoRequest.newBuilder();
request.mergeFrom(protoRequest)
}
Run Code Online (Sandbox Code Playgroud)
这是正确的做法吗?
谢谢
大卫
是否可以从 JAX-RS 带注释的类获取 WSDL 2.0?您知道有这样做的图书馆吗?
附:也许我可以使用 Apache Axis2、Apache Woden 或 WSDL4J?
pps。也许可以从 POJO 获取 WSDL(没有任何注释)?
JAX-RS/Jersey 允许使用注释将 URL 路径元素转换为 Java 方法参数@PathParam。
有没有办法将未知数量的路径元素转换为 vararg Java 方法的参数? IE。/foo/bar/x/y/z应该转到方法:foo(@PathParam(...) String [] params) { ... }哪里params[0]is x、params[1]isy和params[2]isz
我可以在 Jersey/JAX-RS 或其他方便的方式中执行此操作吗?
我正在编写一个 JAX-RS Web 服务,它将 JSON 返回给客户端,并且我正在尝试使用这些org.codehaus.jackson库来处理 JSON 对象。我遇到的问题是我的数据JsonNode在返回给客户端之前没有得到正确的序列化。响应中有很多无关的属性。我希望JsonNode返回最简单的 JSON 表示形式。
这是一个(人为的)示例:
@GET
@Path("user")
@Produces(MediaType.APPLICATION_JSON)
public JsonNode getUser() {
ObjectNode node = JsonNodeFactory.instance.objectNode();
node.put("user", "jDoe");
return node;
}
Run Code Online (Sandbox Code Playgroud)
这个 JSON 响应非常难看:
{"object":true,"elements":[{"textual":true,"textValue":"jDoe","binaryValue":"jDoe","valueAsText":"jDoe","valueNode":true,"containerNode":false,"missingNode":false,"array":false,"object":false,"pojo":false,"number":false,"integralNumber":false,"floatingPointNumber":false,"int":false,"long":false,"double":false,"bigDecimal":false,"bigInteger":false,"boolean":false,"null":false,"binary":false,"booleanValue":false,"intValue":0,"longValue":0,"doubleValue":0.0,"decimalValue":0,"bigIntegerValue":0,"valueAsInt":0,"valueAsLong":0,"valueAsDouble":0.0,"valueAsBoolean":false,"elements":[],"fieldNames":[],"fields":[]}],"fieldNames":["user"],"fields":[{"key":"user","value":{"textual":true,"textValue":"jDoe","binaryValue":"jDoe","valueAsText":"jDoe","valueNode":true,"containerNode":false,"missingNode":false,"array":false,"object":false,"pojo":false,"number":false,"integralNumber":false,"floatingPointNumber":false,"int":false,"long":false,"double":false,"bigDecimal":false,"bigInteger":false,"boolean":false,"null":false,"binary":false,"booleanValue":false,"intValue":0,"longValue":0,"doubleValue":0.0,"decimalValue":0,"bigIntegerValue":0,"valueAsInt":0,"valueAsLong":0,"valueAsDouble":0.0,"valueAsBoolean":false,"elements":[],"fieldNames":[],"fields":[]}}],"containerNode":true,"valueNode":false,"missingNode":false,"array":false,"pojo":false,"number":false,"integralNumber":false,"floatingPointNumber":false,"int":false,"long":false,"double":false,"bigDecimal":false,"bigInteger":false,"textual":false,"boolean":false,"null":false,"binary":false,"booleanValue":false,"intValue":0,"longValue":0,"doubleValue":0.0,"decimalValue":0,"bigIntegerValue":0,"valueAsInt":0,"valueAsLong":0,"valueAsDouble":0.0,"valueAsBoolean":false}
Run Code Online (Sandbox Code Playgroud)
我希望它是简单的
{"user":"jDoe"}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?我不明白为什么将简单的 JsonNode 序列化为 JSON 会出现问题。
就其价值而言,JSONObject从 JSON4J 库返回 a 按预期工作,但我更喜欢使用 Jackson 的库。
考虑以下服务:
@Path("/")
@Stateless
public class SomethingService {
@Context
final HttpServletRequest request
@POST
@Path("post/something/")
@Produces("application/json; charset=UTF-8")
public String addSomething(@FormParam("something") final String something) {
// access to request methods results in NullPointerException
}
}
Run Code Online (Sandbox Code Playgroud)
NullPointerException当方法执行时,我得到了,尽管在调试角度我注意到request它并不是真正的null,而是org.apache.openejb.rest.ThreadLocalHttpServletRequest. 当我将@Context注入移至方法参数级别时,一切正常:
public String addSomething(@FormParam("something") final String something,
@Context final HttpServletRequest request) { ... }
Run Code Online (Sandbox Code Playgroud)
这是什么原因呢?据我记得,在我将服务设为 EJB 之前它曾经可以工作(我这样做是为了使用@EJB或@Inject可能注入 DAO)。JAX-RS 是否为每个请求创建此类服务的实例,因此能够通过类级别注入@Context?EJB 是否会在 JAX-RS 执行任何操作之前通过创建实例并填充代理对象来防止这种情况发生?
我正在尝试使用一组打包在第 3 方 jar 中的 JAX-RS Web 资源。在同一个 jar 中,有一组@Provider,我想用我自己的替换。
有没有办法告诉 JAX-RS 运行时跳过加载某些类?
资源和提供者位于同一个包中。
我在嵌入式 Web 服务器(Jetty)中运行 RESTEasy。
我的资源需要访问支持数据存储,其配置是在用于启动我们的应用程序的命令行上传递的。
理想情况下,我将在资源的构造函数中注入支持数据存储资源:
@Path("/")
public class MappingService{
private final RecordManager recman;
public MappingService(RecordManager recman) {
this.recman = recman;
}
@PUT
@Path("/mapping/{key}")
@Produces({MediaType.APPLICATION_JSON, "application/*+json"})
public Response createMapping(@PathParam("key") String key, @QueryParam("val") String val) {
// do stuff with recman ...
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会在应用程序的其他位置配置 RecordManager 对象,然后将其提供给 MappingService 构造函数。
我发现我可以使用 Application 对象返回特定的单例实例。但看起来 RESTEasy 自己构造了应用程序对象 - 所以我没有看到任何将配置对象传递到应用程序单例的方法。
那么:如何将外部实例化的对象传递到我的资源处理程序中?
我发现这篇文章(在 JAX-RS 请求之间共享变量)描述了如何使用上下文侦听器将对象添加到上下文并将其拉入资源处理程序中 - 但这太可怕了 - 我必须采用 POJO突然间我让它高度依赖于它的容器。请告诉我有更好的方法!
我试图弄清楚如何设置类似于此处解释的 HTTP 标头:
但是,我想使用 RESTeasy 3.0 功能(ResteasyClientBuilder 和 ResteasyWebtarget)而不是已弃用的 ProxyFactory,如下所述:
只是为了澄清,我也不想在每个请求上设置标头/不想将它们传递给客户端,如果可能的话,我希望将它们设置在 ResteasyClientBuilder/ResteasyWebtarget 级别。
我正在从提供者那里了解 MessageBodyReader 方法的工作原理。我看到该方法返回一个对象,但我不确定如何从服务访问该对象。我可以获得有关如何从 reader 类返回对象的解释吗?这将帮助我为所有 DTO 应用读取规则。提前致谢!
服务:
@POST
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("/CreateAccount")
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response createAccount(@Context HttpServletRequest req) {
String a = "Reader success? ";//Would to see that string here!
return Response.ok().build();
}
Run Code Online (Sandbox Code Playgroud)
提供商:
@Provider
public class readerClass implements MessageBodyReader<Object>
{
@Override
public boolean isReadable(Class<?> paramClass, Type paramType,
Annotation[] paramArrayOfAnnotation, MediaType paramMediaType) {
// TODO Auto-generated method stub
return true;
}
@Override
public Object readFrom(Class<Object> paramClass, Type paramType,
Annotation[] paramArrayOfAnnotation, MediaType paramMediaType,
MultivaluedMap<String, String> paramMultivaluedMap, …Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 Java 桌面应用程序将一些对象(字符串)发布到部署在 WildFly 应用程序服务器上的 REST 服务。不幸的是,我没有在运行时为客户端提供 Maven,因此我必须手动添加所需的 JAR 文件。然而,即使使用像这样的简单 POST:
public static void testParam() {
Client client = ClientBuilder.newClient();
String s="DatiAtto.xml";
WebTarget myResource = client.target(BASE_URL+"/create");
Response rs = myResource.request()
.post(Entity.text(s), Response.class);
}
Run Code Online (Sandbox Code Playgroud)
我得到的回报:
Unable to loadbuiltinprovider: org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider
到目前为止,我已将以下 JAR 文件添加到桌面应用程序:
查看它们的内容,类org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider应该被打包到resteasy-jackson2-provider-3.0.8.Final.jar中。为什么没有被加载?
jax-rs ×10
java ×6
resteasy ×4
jakarta-ee ×3
rest ×3
apache-tomee ×1
ejb ×1
jackson ×1
jersey ×1
web-services ×1
wildfly ×1
wsdl ×1