标签: jax-rs

Jersey/Grizzly的基本HTTP身份验证

我使用JAX-RS,Jersey和Grizzly编写了一个简单的REST服务器.这就是我启动服务器的方式:

URI baseUri = UriBuilder.fromUri("http://localhost/api")
                        .port(8081)
                        .build();

ResourceConfig rc = new PackagesResourceConfig("se.aioobe.resources");
HttpServer httpServer = GrizzlyServerFactory.createHttpServer(baseUri, rc);
Run Code Online (Sandbox Code Playgroud)

现在我需要使用基本HTTP身份验证来保护资源,我无法弄清楚如何执行此操作.

我可以从Grizzly切换到例如Jetty,如果它更容易让它工作,但我真的很重视Grizzly提供的简单配置/启动.

我已经阅读了很多教程.他们都提到了web.xml,但在我目前的配置中我没有.(我是否需要添加一个用于HTTP身份验证?)我发现了以下 问题,它们都没有任何帮助:-(

(此时不需要SSL.此时的身份验证只是为了防止公众在我们的测试版中偷看.)

TL; DR:如何向Jersey/Grizzly webapp添加基本HTTP身份验证?

java jax-rs jersey http-authentication grizzly

10
推荐指数
1
解决办法
1万
查看次数

jersey和jax-rs RI2 - 缺少HttpServerFactory

我有一个简单的项目来测试JAX-RS服务.昨天我下载了jersey-1.7.1,并使用com.sun.jersey.api.container.httpserver.HttpServerFactory和com.sun.net.httpserver.HttpServer来创建一个http服务器来测试我在Eclipse中的服务(没有重载重量容器)

今天,我下载了最新的球衣罐(jaxrs-ri),缺少HttpServerFactory.看起来他们在1.7.1 => 2.0之间删除了类,但我在弃用部分找不到它.我在API部分看到了grizzly2类(也许这就是我现在应该使用的)但是jaxrs-ri bundle中的jar都没有提供这些类.我下载了jersey-grizzly 1.12 jar,但它只有com/sun/jersey/server/impl/container/grizzly2/GrizzlyContainer类,没有实现.

对善良的灵魂提出质疑

1 - 使用来自泽西下载页面的最新jaxrs-ri jar,如果不推荐使用1.7.1方式,建议使用命令行创建简单http服务器的方法.什么罐子下载/包括,也许是一个简短的代码示例?

2 - 关于使用java创建简单REST服务的整个文档是一个很大的混乱.那么你如何找到正确的信息呢?

(真的,这不是一个玩笑.也许这需要一个单独的博客文章 - 只看一塌糊涂,更改API,没有关于弃用功能的信息,实现差异,例如CXF vs. jersey,API 1.x vs API 2.0, Glassfish容器v xy与Tomcat,y版本x与y版本x2,servlet 3.0将拥有此文件,您是否正在扩展应用程序!)

更新

JDKHttp服务器的工作示例

package test.jersey;

import java.net.URI;
import com.sun.net.httpserver.HttpServer;
import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory ;
import org.glassfish.jersey.server.ResourceConfig;

public class ConsoleServerV2 {

    static final String BASE_URI = "http://localhost:9099/";

    public static void main(String[] args) throws Exception {
        HttpServer server = null ;

        ResourceConfig rc = new ResourceConfig(rest.Service.class);
        URI endpoint = new URI(BASE_URI);

        server = JdkHttpServerFactory.createHttpServer(endpoint,rc);
        System.out.println("console v2.0 : Press …
Run Code Online (Sandbox Code Playgroud)

java jax-rs jersey grizzly

10
推荐指数
1
解决办法
1万
查看次数

为什么Eclipse Kepler SR1出错:JAX-RS 2.0需要Java 1.7或更高版本

我有一个maven项目,给出以下两个错误

无法安装JAX-RS(REST Web服务)2.0:尚未满足一个或多个约束.
JAX-RS(REST Web服务)2.0需要Java 1.7或更高版本.

我安装了JDK 1.6(我无法更改)

项目方面没有勾选JAX-RS.

项目方面有java 1.6设置.

项目方面有动态Web项目2.4集.

我有以下插件

声纳3.2.0 MercurialEclipse 2.10 EclEmma 2.2.1

pom.xml就是这个......

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.pcmsgroup.v21.esi</groupId>
    <artifactId>customerservice-war</artifactId>
    <version>2.0.0-SNAPSHOT</version>
</project>
Run Code Online (Sandbox Code Playgroud)

web.xml是

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Customer Service</display-name>
</web-app>
Run Code Online (Sandbox Code Playgroud)

清理或"更新Maven项目"没有任何区别.

注意:这是在eclipse-jee-kepler-SR1-win32-x86_64中.注意:版本eclipse-jee-kepler-win32-x86_64不会给出错误.

注意:新工作区不会更改错误.

注意:我正在使用JDK.1.6.0_43

我在".log"文件中看到的与此相关的唯一错误是..

!ENTRY org.eclipse.osgi 2 1 2013-10-16 15:07:58.816!MESSAGE NLS未使用的消息:JaxrsProjectConfigurator_The_project_does_not_contain_required_facets in:org.eclipse.m2e.wtp.jaxrs.internal.messages

添加方面,不要让我应用它,因为它说我需要Java 1.7

JSR339(JSR339)声明"API将广泛使用注释,并将需要J2SE 6.0或更高版本"

有任何想法吗?

eclipse jax-rs eclipse-kepler

10
推荐指数
2
解决办法
2万
查看次数

使用Jersey的ExceptionMapper忽略web.xml错误页面

@Provider
public class JerseyExceptionMapper implements ExceptionMapper<JerseyException> {


    @Override
    public Response toResponse(JerseyException jerseyException) {
        return Response.status(jerseyException.getErrorCode()).
                entity(jerseyException.getJsonResponseObj()).
                type(MediaType.APPLICATION_JSON).
                build();
    }

}
Run Code Online (Sandbox Code Playgroud)

当您在中使用<error-page>组件时,上面的代码会产生不需要的结果web.xml.例如,如果my Response.status设置为400而我的error-page组件定义<error-code>为400,则Web服务器会将请求重定向到中定义的位置web.xml.

这显然不是我想要的REST请求.我在StackOverflow上读了另一篇帖子,说明了请求被转移到的原因error-page是因为HttpServletResponse.sendError(400)设置了.该帖子说如果你设置了HttpServletResponse.setStatus(400),那error-page将被忽略.

如果这是真的,我不知道它是如何有用的,因为我没有实现Jersey代码.我看到的选项是调查Response类源代码,并可能重新实现status方法或其他Jersey代码.这里有一个简单的选择还是我缺少的东西?

从本质上讲,我的问题是:鉴于我正在使用Jersey for REST而我正在使用错误页面,我web.xml如何使用上面的代码而忽略error-page仅用于Jersey代码?导致HTTP错误的任何其他代码都应该转到error-page.或者是否有其他解决方案不涉及error-page但将与我想要的工作相同?

java jax-rs jersey

10
推荐指数
1
解决办法
2295
查看次数

是否可以为get和post rest api使用相同的资源名称

不久之后,我用Java开发了一个只有1个GET资源的Restful服务.它是这样访问的:

获取http:// localhost:8080/my-project/customers/transactions

此GET请求返回所有客户事务.

现在,我有另一个项目请求,他们希望在同一个数据库中的不同模式中插入客户事务.我认为不是创建其他服务而是可以增强此服务,因为底层数据库是相同的,而且是关于客户事务.

所以,我在我的服务界面中创建了另一个方法,我createCustomerTransactions想将它命名为与我的GET请求相同,但是这个将是这样的POST:

POST http:// localhost:8080/my-project/customers/transactions

我使用Soap-UI测试了这个并且它可以工作.我的问题是做Restful的正确方法.可以让GET和POST同时具有相同的url,虽然它们会指向不同的实际方法吗?我不擅长名字,所以不能提出另一个更好的资源名称.

rest jax-rs restful-url restful-architecture

10
推荐指数
1
解决办法
8236
查看次数

用实体抛出的WebApplicationExceptions的ExceptionMapper?

在我们的(遗留)代码库中,我们以不同的方式抛出WebApplicationExceptions.为了对我们如何处理异常做出一些命令 - 我想为这些WAE(和其他)创建一个ExceptionMapper.

然而,我意识到Jersey的ExceptionMapper只映射了未被实体抛出的WAE.

例如:

throw new WebApplicationException(Response.status(500).build());
Run Code Online (Sandbox Code Playgroud)

ExceptionMapper捕获此异常.

throw new WebApplicationException(Response.status(500).entity(WsResourceUtils.createWSResourceRestError(500, "bla")).build());
Run Code Online (Sandbox Code Playgroud)

ExceptionMapper不会捕获此异常.

两者都是从代码中的相同点抛出的.

这是我的ExceptionMapper:

@Provider
public class GeneralExceptionMapper implements ExceptionMapper<Throwable> {

    private static final Logger logger = LoggerFactory.getLogger(GeneralExceptionMapper.class);

    @Override
    public Response toResponse(Throwable e) {
        logger.error("Caught a WAE", e);
...
}
Run Code Online (Sandbox Code Playgroud)

是否有可能创建一个ExceptionMapper,即使它们的响应已经使用实体构建,它也会捕获WebApplicationExceptions?

我们正在使用Jersey 1.17.

谢谢.

java jax-rs jersey

10
推荐指数
1
解决办法
2322
查看次数

泽西岛:我可以在ContainerResponseFilter中添加一个cookie吗?

我有一个ContainerResponseFilter,我试图在其中设置一个cookie如下:

@Override
public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException {
    String cookieName = "ExampleCookie";
    String cookieValue = "SomeData";
    logger.info("Setting cookie " + cookieName + " with value " + cookieValue + " into cookies " + JsonUtils.objectToJson(containerResponseContext.getCookies()));
    containerResponseContext.getCookies().put(cookieName, new NewCookie(cookieName, cookieValue));
}
Run Code Online (Sandbox Code Playgroud)

但这会产生以下错误:

Caused by: java.lang.UnsupportedOperationException: null
    at java.util.AbstractMap.put(AbstractMap.java:203) ~[na:1.7.0_67]
Run Code Online (Sandbox Code Playgroud)

在这里设置cookie是不可能的?如果是的话,我该怎么做?

cookies jax-rs jersey servlet-filters

10
推荐指数
1
解决办法
3425
查看次数

Swagger with Resteasty 3 + Jetty 9.2 + JAX-RS 3

我正在尝试配置现有的应用程序以使用Swagger.该应用程序使用Resteasy 3和Jetty 9.2以及JAX-RS 3.

我的更改基于Swagger wiki上的解释.

我首先在build.gradle中添加了swagger 1.5.0,然后在名为SchedulerStateRest的资源上添加注释@Api@ApiOperation.

下一步是编辑我的web.xml,以便使用Swagger的Servlet 在我的ApplicationInitialize Swagger中连接Swagger-Core.

我的问题是,当我启动我的应用程序,没有相应的资源,当我浏览发现/swagger.json/swagger.yamlHTTP://本地主机:8080.但是,启动Jetty并且现有服务正在运行且可用时,我没有收到任何错误.

我已经启用了Jetty日志但是我没有找到与我相关的信息(启动Jetty嵌入式的负责人是JettyStarter).

通过查找类似的问题,我发现有些人说在/ v1/api-docs上应该提供swagger内容,所以我尝试了不同的URL,但我总是遇到404错误.

最近,我发现了ben- manes的一个要点,用Resteasy 3 + Guice 4来配置swagger.我试图模仿它的配置,并根据Guice-servlet的解释推断出web.xml的配置,但我最终遇到的问题与上面说明的配置(没有可用的资源是预期的地址).

由于启动嵌入式Jetty时没有错误,我想知道问题是否与错误的地址无关.您知道如何列出Jetty实例上可用的"资源"吗?

我注意到Swagger维基上的解释是针对Resteasy 2.X. 这是否意味着Swagger与Resteasy 3.x不兼容?

调试的想法,建议等,欢迎解决问题;)

jetty jax-rs resteasy swagger

10
推荐指数
1
解决办法
1017
查看次数

如何在角度和重复的同一请求中上传图像和数据?

我正面临一个问题,即在后端使用jax-rs进行角度调整.crud非常简单,有些文本字段和图像字段.

我有代码工作上传图像:

@POST
@Consumes("multipart/form-data")
public Response uploadFile(MultipartFormDataInput input) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

并在html层:

<form action="http://localhost:8080/app/api/user" method="post" enctype="multipart/form-data">
   <p>
    Choose a file : <input type="file" name="file" />
   </p>
   <input type="submit" value="Upload" />
</form>
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是如何在这一步中做到这一点:

@POST
@Consumes("multipart/form-data")
public Response save(MultipartFormDataInput input, MyEntity entity) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试从视图层调用上面的代码,那么wildfly会给出一个错误,该错误没有找到要与MyEntity参数绑定的数据.

[org.jboss.resteasy.core.ExceptionHandler] (default task-3) failed to execute: javax.ws.rs.NotSupportedException: 
Could not find message body reader for type: class mypackage.MyEntity of content type: multipart/form-data;boundary=----WebKitFormBoundaryRXVvqLpZACPylNgS
Run Code Online (Sandbox Code Playgroud)

有谁知道我该怎么做?或者说我分两步走了吗?

java jax-rs resteasy angularjs

10
推荐指数
1
解决办法
8565
查看次数

服务器使用JAX-RS和RESTeasy在单个URL中向客户端发送"ping请求"

我想创建一个Web应用程序,一旦客户端访问了某个URL(例如www.example.com/ping/hello)就可以"ping"客户端,以获得服务器和客户端之间的往返时间.通过"ping"请求,我的意思是一个简单的请求,带有来自服务器和客户端的时间戳,并发送回时间戳的响应.我希望如果可能的话,使用单个URL完成此活动.

流程是这样的:

  1. 客户端转到URL
  2. 服务器使用其时间戳将响应发送到客户端
  3. 然后,客户端使用新的时间戳向服务器发送另一个响应
  4. 服务器最终以200 OK结束连接

到目前为止,我只能完成第一步和第二步,但不知道如何确保客户端再次转到相同的URL而不返回第一步.

我的服务器代码是这样的:

@GET
@Path("/helloping")
public Response getPingServerClient(@Context HttpServletRequest req) {
    String result = Long.toString(System.currentTimeMillis());

    return Response.status(200).entity(result).build(); 

    //the code to receive the response from client containing timestamp
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

java rest jax-rs resteasy

10
推荐指数
1
解决办法
238
查看次数