有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jersey测试框架和HK2Guice桥

还有基于Jersey 2.23.2和;Guice 3.0。要使用Guice,需要调整hk2-guice bridge(我使用的是2.5.0-b07)。在我尝试使用Jersey Test Framework测试服务之前,一切都正常。无法为测试配置hk2 guice桥

我的测试:

public class SomeTest extends JerseyTestNg.ContainerPerClassTest {

    @Override
    protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
        return new GrizzlyWebTestContainerFactory();
    }

    @Override
    protected Application configure() {
        return super.configure(); // cant't configure
    }

    @Test
    public void test() {
        Assert.assertEquals(1, 1);
    }
}

我无法在SomeTest.configure()中配置测试,只返回new JerseyConfiguration()(见下文),因为JerseyConfiguration的构造函数需要ServiceLocator的对象

即使可以返回“JerseyConfiguration”类的对象,我也不确定我的测试是否有效,因为有些过滤器和侦听器是在web中定义的。xml文件

如何在考虑所有过滤器、侦听器和hk2 guice桥接器的情况下配置测试


Web服务详细信息

来自构建的依赖项部分。格雷德尔:

def jerseyVersion = '2.23.2'
def hk2Version = '2.5.0-b07'
def giuceVersion = '3.0'

dependencies {
    compile "javax.servlet:javax.servlet-api:3.1.0"
    //jersey
    compile "org.glassfish.jersey.core:jersey-server:${jerseyVersion}"
    compile "org.glassfish.jersey.containers:jersey-container-servlet:${jerseyVersion}"
    //hk2
    compile "org.glassfish.hk2:guice-bridge:${hk2Version}"
    //guice
    compile "com.google.inject:guice:${giuceVersion}"
    compile "com.google.inject.extensions:guice-servlet:${giuceVersion}"
}

文件网。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">

    <display-name>REST API App</display-name>

    <listener>
        <listener-class>com.example.core.JerseyGuiceServletContextListener</listener-class>
    </listener>

    <filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>guiceFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>jerseyFilter</filter-name>
        <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.example.core.JerseyConfiguration</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>jerseyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

JerseyGuiceServletContextListener类:

public class JerseyGuiceServletContextListener extends GuiceServletContextListener {
    static Injector injector;

    @Override
    protected Injector getInjector() {
        injector = Guice.createInjector(new JerseyServletModuleConfig());
        return injector;
    }
}

等级Jersey ServletModuleConfig:

class JerseyServletModuleConfig extends ServletModule {
    @Override
    protected void configureServlets() {
        bind(HeyResource.class).in(Scopes.SINGLETON);
    }
}

职业球衣配置:

package com.example.core;

import com.google.inject.Injector;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.jersey.server.ResourceConfig;
import org.jvnet.hk2.guice.bridge.api.GuiceBridge;
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;

import javax.inject.Inject;
import javax.servlet.ServletContext;

class JerseyConfiguration extends ResourceConfig {
    @Inject
    public JerseyConfiguration(ServiceLocator serviceLocator, ServletContext servletContext) {
        packages("com.example.ws");
         GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
         GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
         guiceBridge.bridgeGuiceInjector(JerseyGuiceServletContextListener.injector);
    }
}

共 (1) 个答案

  1. # 1 楼答案

    只需越过configureDeployment()&;试验中改进的configure()方法

    public class SomeTest extends JerseyTestNg.ContainerPerClassTest {
    
        @Override
        protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
            return new GrizzlyWebTestContainerFactory();
        }
    
    @Override
        protected Application configure() {
            return new ResourceConfig()
                    .packages("com.example.ws")
                    .register(GensonCustomResolver.class);
        }
    
        @Override
        protected DeploymentContext configureDeployment() {
            Application application = configure();
    
            return ServletDeploymentContext.builder(application)
                    .addListener(JerseyGuiceServletContextListener.class)
                    .addFilter(GuiceFilter.class, "guiceFilter")
                    .addFilter(ServletContainer.class, "jerseyFilter", new HashMap<String, String>(){{
                        put("javax.ws.rs.Application", JerseyConfiguration.class.getCanonicalName());
                    }})
                    .build();
        }
    
        @Test
        public void test() {
            Assert.assertEquals(1, 1);
        }
    }
    

    &;添加网页。xml来测试类路径