使用CDI时,休息服务无效:服务保持为空

时间:2017-08-07 12:52:51

标签: java java-ee jax-rs cdi

我正在使用JAX-RS制作休息服务应用程序。它用于学校的一些项目。对于这个项目,我需要使用以下技术: •Maven •JAX-RS •CDI •JPA - EJB •JNDI •Bean验证

所以现在我已经使用假冒DB(“CafeStub”)和使用JPA(“CafeDB”)的真实数据库将我的域“Cafes”归档。我的域名也使用了一些CDI。 (@Service在CafeService类中...)

非我想使用JAX-RS创建我的休息服务。这工作得很好: enter image description here

我的问题是,当我再次尝试使用CDI时,它会失败,并且它会产生500异常,NullPointerException,“严重:RuntimeException无法映射到响应,重新投掷到HTTP容器” 完整Stacktrace: enter image description here

我不知道如何解决这个问题,已经搜索了很长时间..希望有人可以帮助我:s

这是我的“CafeController”课程。制作休息服务

Path("/cafes")
public class CafeController {

@Inject
private CafeFacade cafeFacade;

public CafeController() {
   //this.cafeFacade = new CafeService();
}

@GET
@Produces("application/json")
public Response getCafes(){
    try{
        // test ........ 
        ObjectMapper mapper = new ObjectMapper();
        Cafe cafe = cafeFacade.getCafe(new Long(1));
        String jsonInString = mapper.writeValueAsString(cafe);
        return Response.status(200).entity(jsonInString).build();
    }catch (JsonProcessingException jsonEx) {
        System.out.println("Json Exception");
        System.out.println(jsonEx.getMessage());
        return null;
    }
}

这是“CafeService”课程,实施“CafeFacade”

public class CafeService implements CafeFacade {

@Inject
private CafeRepository cafeRepository;

public CafeService() {
    //cafeRepository = new CafeStub();
    //cafeRepository = new CafeDB("CafesPU");
}

@Override
public long addCafe(Cafe cafe) {
    return this.cafeRepository.addCafe(cafe);
}

@Override
public Cafe getCafe(long cafeID) {
    return this.cafeRepository.getCafe(cafeID);
}

她看到了“CafeStub”类,实现了“CafeRepository”

的类
public class CafeStub implements CafeRepository {

private static Map<Long, Cafe> cafes;
private static long counter = 0;

public CafeStub() {
    cafes = new HashMap<Long, Cafe>();

    // adding some dara
    this.addSomeData();
}    

@Override
public long addCafe(Cafe cafe) {
    if(cafe == null){
        throw new DBException("No cafe given");
    }
    counter++;
    cafe.setCafeID(counter);
    cafes.put(cafe.getCafeID(), cafe);
    return cafe.getCafeID();
}

@Override
public Cafe getCafe(long cafeID) {
    if(cafeID < 0){
        throw new DBException("No correct cafeID given");
    }
    if(!cafes.containsKey(cafeID)){
        throw new DBException("No cafe was found");
    }
    return cafes.get(cafeID);
}

至少在这里你可以看到我的pom.xml(来自CafeService项目的依赖项) - web.xml(来自CafeService项目)和项目结构......

<dependencies>
    <dependency>
        <groupId>Cafes</groupId>
        <artifactId>Cafes</artifactId>
        <version>0.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.3</version>
        <type>jar</type>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.3.1</version>
    </dependency>    
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-bundle</artifactId>
        <version>1.19.4</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.19.4</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.19.4</version>
    </dependency>
</dependencies>

enter image description here

enter image description here

提前致谢... 干杯 汤姆

2 个答案:

答案 0 :(得分:1)

仅使用@Path注释的类不会将该类标记为CDI bean,因为它不在CDI规范中定义注释的bean列表中。将RequestScoped添加到REST服务将其标记为CDI bean,因此注入工作正如您所发现的那样。

这里的答案列出了将类标记为CDI bean的注释。 Is @javax.annotation.ManagedBean a CDI bean defining annotation?

答案 1 :(得分:0)

解决了..RequestScoped做了伎俩.. Daimn搜索了很长时间的一个注释。

{
 typ: "JWT",
 alg: "RS256",
 kid: "VWVIc1WD1Tksbb301sasM5kOq5Q"
}.
{
 aud: "36d2abdd-2363-4ff9-b597-77d41e0e3b81",
 iss: "https://login.microsoftonline.com/GUID/v2.0",
 iat: 1502173871,
 nbf: 1502173871,
 exp: 1502177771,
 aio: "ATQAy/8EAAAA2JCq8vpq6La3M0KIKWw1vgJOfhDQyurYRhbCR47qSjByGzPkyZX0zi5y9uYCQS+q",
 c_hash: "3JkkVwHgmYiHvR-gVdb22w",
 name: "First name Last name",
 nonce: "636377709651517241.MDNkOWNhYzMtYjk4NC00OTBkLWI2Y2EtYzU5NmM0NWZjOGExNWQxZmU3MTgtN2RhYS00NjVlLTkwZDgtZjIwOGY4NTcyNTZi",
 oid: "4f64d4db-8115-4f19-8554-bedf20688226",
 preferred_username: "firstname.lastname@company.com",
 sub: "MRN4y1TZ-qG1uxrL7ozf8KbBm0VbcbH7djaKK187qH8",
 tid: "34e9a1f3-23e1-4ead-b2fd-41660c25cc47",
 ver: "2.0"
}.

我仍然不明白为什么需要使用它。 @RequestScoped:CDI实例化和管理bean - &GT;我以为我的bean.xml会实例化并管理bean吗?