我正在构建一个REST API.我的问题是,在使用Jersey时,我的服务构建和返回Response对象或返回bean或集合之间有什么区别.我只关心成功的电话,我正在为错误和特殊情况抛出适当的例外.
这是一个例子:
@Produces(MediaType.APPLICATION_JSON)
public Response search(FooBean foo){
List<FooBean> results = bar.search(foo);
return Response.ok(results).build();
}
Run Code Online (Sandbox Code Playgroud)
与
@Produces(MediaType.APPLICATION_JSON)
public List<FooBean> search(FooBean foo){
List<FooBean> results = bar.search(foo);
return results;
}
Run Code Online (Sandbox Code Playgroud)
我已经看过两个例子,我更喜欢第二种情况,只是为了更容易识别服务方法.我已经检查了对这两种方法的反应,看起来它们是相同的.
思考?
有可能做那样的事吗?
import javax.ws.rs.GET;
import javax.ws.rs.Path;
public class xxx
{
@GET
@Path(value = "path1")
public Response m1()
{
...
}
@GET
@Path(value = "path2")
public Response m2()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用RESTEasy.
我正在构建RESTful API,并希望为开发人员提供选择在JSON响应中返回哪些字段的选项. 此博客文章显示了几个API(Google,Facebook,LinkedIn)如何允许开发人员自定义响应的示例.这被称为部分响应.
示例可能如下所示:
/users/123?fields=userId,fullname,title
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,API应返回User"123"的userId,fullName和title字段.
我正在寻找如何在我的RESTful Web服务中实现它的想法.我目前正在使用CXF(编辑:和杰克逊),但愿意尝试另一种JAX-RS实现.
这就是我现在拥有的.它返回一个完整的User对象.如何根据"字段"参数返回API调用者在运行时想要的字段?我不想让其他字段为空.我根本不想归还他们.
@GET
@Path("/{userId}")
@Produces("application/json")
public User getUser(@PathParam("userId") Long userId,
@DefaultValue("userId,fullname,title") @QueryParam("fields") String fields) {
User user = userService.findOne(userId);
StringTokenizer st = new StringTokenizer(fields, ",");
while (st.hasMoreTokens()) {
// here's where i would like to select only the fields i want to return
}
return user;
}
Run Code Online (Sandbox Code Playgroud)
更新:
我按照unludo的链接然后链接到这个:http://wiki.fasterxml.com/JacksonFeatureJsonFilter
有了这些信息,我就加入@JsonFilter("myFilter")了我的域类.然后我修改了我的RESTful服务方法以返回String而不是User,如下所示:
@GET
@Path("/{userId}")
@Produces("application/json")
public String getUser(@PathParam("userId") Long userId,
@DefaultValue("userId,fullname,title") @QueryParam("fields") String fields) {
User user = userService.findOne(userId);
StringTokenizer …Run Code Online (Sandbox Code Playgroud) 我有一个服务,其中路径的最后一部分是可选的,用户可以输入/ mypath /和/ mypath/param1 /.
我试图使用正则表达式来过滤路径的最后部分:
@Path("/mypath{param1: (/param1)?}")
我正在使用RestEasy作为我的JAX-RS提供程序,代码在Tomcat中按预期工作,但是当我在JBoss中部署它时,当我不提交可选部分时,我得到405返回代码.
我在这里做错了什么,或者不可能以便携的方式实现这个目标?
我是新手,试图阅读一些文档,但它不起作用,请耐心等待.
我创建了一个UserNotFoundMapper使用ExceptionMappers这样的:
public class UserNotFoundMapper implements ExceptionMapper<UserNotFoundException> {
@Override
public Response toResponse(UserNotFoundException ex) {
return Response.status(404).entity(ex.getMessage()).type("text/plain").build();
}
}
Run Code Online (Sandbox Code Playgroud)
这在我的服务中:
@GET
@Path("/user")
public Response getUser(@QueryParam("id") String id) throws UserNotFoundException{
//Some user validation code with DB hit, if not found then
throw new UserNotFoundException();
}
Run Code Online (Sandbox Code Playgroud)
这UserNotFoundException是一个User-Defined例外.
我试过这个:
public class UserNotFoundException extends Exception {
//SOME block of code
}
Run Code Online (Sandbox Code Playgroud)
但是当我调用该服务时,UserDefinedExceptionMapper不会被调用.看来我可能会遗漏一些东西UserDefinedException.那么如何定义这个异常呢?
请让我知道如何定义UserNotFoundException.
据我所知,两者都有同样的目的.除了@PathVariable来自Spring MVC并@PathParam来自JAX-RS 的事实.有什么见解吗?
我是JAX-RS的新手,我正在尝试使用Jersey构建一个简单的RESTful Web服务.
我有两个问题.请澄清这些:
我想尝试像这个URL一样简单的web服务 http://localhost:8080/SampleJersey/rest/inchi/InChIName
InChIName是这样的字符串InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2- 5H,1H3,(H,11,12).我如何传递这个@PathParam,我的意思是一个普通的字符串工作正常,但这里有斜杠,连字符和逗号.如何让它忽略这些.我试着把它放在引号中,但那不起作用.我该怎么做?
我需要将它传递InChI给另一个webservice并返回一个XML作为输出,我想将该XML输出显示为我的Webservice的输出.如果我有@Produces("application/xml")它会工作吗?
这是我的代码:
@Path("/inchi")
public class InChIto3D {
@GET
@Path("{inchiname}")
@Produces("application/xml")
public String get3DCoordinates(@PathParam("inchiname")String inchiName) {
String ne="";
try{
URL eutilsurl = new URL(
"http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?"
+ "db=pccompound&term=%22"+inchiName+"%22[inchi]");
BufferedReader in = new BufferedReader(
new InputStreamReader(eutilsurl.openStream()));
String inputline;
while ((inputline=in.readLine())!=null)
ne=ne+inputline;
}catch (MalformedURLException e1) {
}catch (IOException e2){
}
return ne;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Jersey + Jackson为我的应用程序提供REST JSON服务层.我遇到的问题是默认的日期序列化格式如下所示:
"CreationDate":1292236718456
Run Code Online (Sandbox Code Playgroud)
起初我以为它是一个UNIX时间戳......但它太长了.我的客户端JS库在反序列化这种格式时遇到了问题(它支持一堆不同的日期格式,但我认为不支持这种格式).我想更改格式,以便我的库(例如ISO)可以使用它.我该怎么做...我找到了一段可以帮助的代码,但是......我把它放在哪里因为我不控制杰克逊序列化器实例化(泽西岛)?
objectMapper.configure(
SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
Run Code Online (Sandbox Code Playgroud)
我也发现这个代码用于自定义JacksonJsonProvider- 问题是..如何让我所有的POJO类使用它?
@Provider
public class MessageBodyWriterJSON extends JacksonJsonProvider {
private static final String DF = "yyyy-MM-dd’T'HH:mm:ss.SSSZ";
@Override
public boolean isWriteable(Class arg0, Type arg1, Annotation[] arg2,
MediaType arg3) {
return super.isWriteable(arg0, arg1, arg2,
arg3);
}
@Override
public void writeTo(Object target, Class arg1, Type arg2, Annotation[] arg3,
MediaType arg4, MultivaluedMap arg5, OutputStream outputStream)
throws IOException, WebApplicationException {
SimpleDateFormat sdf=new SimpleDateFormat(DF);
ObjectMapper om = new ObjectMapper();
om.getDeserializationConfig().setDateFormat(sdf);
om.getSerializationConfig().setDateFormat(sdf);
try {
om.writeValue(outputStream, target); …Run Code Online (Sandbox Code Playgroud) 我开始在JAX-RS中使用新的客户端API库,并且到目前为止真的非常喜欢它.我找到了一件我无法弄清楚的事情.我使用的API有一个自定义错误消息格式,例如:
{
"code": 400,
"message": "This is a message which describes why there was a code 400."
}
Run Code Online (Sandbox Code Playgroud)
它返回400作为状态代码,但还包含一条描述性错误消息,告诉您错误.
但是,JAX-RS 2.0客户端将400状态重新映射到通用的状态,我丢失了良好的错误消息.它正确地将它映射到BadRequestException,但具有通用的"HTTP 400 Bad Request"消息.
javax.ws.rs.BadRequestException: HTTP 400 Bad Request
at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:908)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:770)
at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:90)
at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:671)
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.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:667)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:396)
at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:296)
Run Code Online (Sandbox Code Playgroud)
是否有某种拦截器或自定义错误处理程序可以注入,以便我可以访问真正的错误消息.我一直在查看文档,但看不到任何方法.
我现在正在使用Jersey,但是我尝试使用CXF并得到了相同的结果.这是代码的样子.
Client client = ClientBuilder.newClient().register(JacksonFeature.class).register(GzipInterceptor.class);
WebTarget target = client.target("https://somesite.com").path("/api/test");
Invocation.Builder builder = target.request()
.header("some_header", value)
.accept(MediaType.APPLICATION_JSON_TYPE)
.acceptEncoding("gzip");
MyEntity entity = builder.get(MyEntity.class);
Run Code Online (Sandbox Code Playgroud)
更新:
我实现了下面评论中列出的解决方案.它略有不同,因为类在JAX-RS 2.0客户端API中有所改变.我仍然认为默认行为是提供一般错误消息并丢弃真实错误消息是错误的.我理解为什么它不会解析我的错误对象,但应该返回未解析的版本.我最终得到了库已经执行的复制异常映射.
谢谢您的帮助.
这是我的过滤器类:
@Provider
public …Run Code Online (Sandbox Code Playgroud) jax-rs ×10
java ×8
jersey ×4
rest ×3
jackson ×2
json ×2
cxf ×1
jax-ws ×1
jboss ×1
regex ×1
resteasy ×1
restful-url ×1
spring-mvc ×1
web-services ×1