我想,对于一个可以注射的课程,任何课程都必须注释。但我看到一个示例演示了一个简单的REST服务,其中注入了没有任何注释的类。 HelloService没有注释。这是豆吗?它的生命周期范围怎么样?
/**
* A simple CDI service which is able to say hello to someone
*
* @author Pete Muir
*
*/
public class HelloService {
String createHelloMessage(String name) {
return "Hello " + name + "!";
}
}
/**
* A simple REST service which is able to say hello to someone using HelloService Please take a look at the web.xml where JAX-RS
* is enabled And notice the @PathParam which expects the URL to contain /json/David or /xml/Mary
*
* @author bsutter@redhat.com
*/
@Path("/")
public class HelloWorld {
@Inject
HelloService helloService;
@POST
@Path("/json/{name}")
@Produces("application/json")
public String getHelloWorldJSON(@PathParam("name") String name) {
System.out.println("name: " + name);
return "{\"result\":\"" + helloService.createHelloMessage(name) + "\"}";
}
@POST
@Path("/xml/{name}")
@Produces("application/xml")
public String getHelloWorldXML(@PathParam("name") String name) {
System.out.println("name: " + name);
return "<xml><result>" + helloService.createHelloMessage(name) + "</result></xml>";
}
}
这个例子中的另一个问题是,为什么它使用&#34;你好&#34;在web.xml中?没有任何类被定义为&#34; hello&#34;,并且没有任何名为&#34; hello&#34;的目录。在项目中。
<web-app version="3.0" 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_3_0.xsd">
<!-- One of the ways of activating REST Servises is adding these lines.
The server is responsible for adding the corresponding servlet automatically.
The class org.jboss.as.quickstarts.html5rest.HelloWorld class has the
annotation @Path("/") to receive the REST invocation -->
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
</web-app>
答案 0 :(得分:3)
您没有提到这是Jave EE 6还是7,而且您也没有包含beans.xml
文件。
在Java EE 6中,如果存在META-INF/beans.xml
,则可以注入具有公共默认构造函数的任何类,然后自动成为托管CDI bean。在Java EE 7中,bean-discovery-mode="all"
中的beans.xml
可以实现同样的效果,请参阅this question
答案 1 :(得分:1)
要使REST服务bean能够注入其他服务,您应该使用CDI bean或EJB bean作为REST服务实现bean。如果您没有指定REST实现bean的类型,则它取决于提供者,将使用哪种实现。通常默认情况下它不是可注入的。
通常在大多数情况下,使用@Named for CDI bean实现和@Stateless for EJB实现。