我将使用TomEE嵌入式EJBContainer测试我的EJB.
这是我的JUnit测试用例框架:
package com.xxx.indexer.scheduler.service;
import java.util.Properties;
import javax.ejb.embeddable.EJBContainer;
import javax.naming.NamingException;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.xxx.indexer.scheduler.AbstractTest;
public class BookingAuditServiceImplTest extends AbstractTest {
private static EJBContainer container;
@BeforeClass
public static void start() {
final Properties props = new Properties();
props.setProperty(EJBContainer.PROVIDER, "tomee-embedded");
container = EJBContainer.createEJBContainer(props);
}
@AfterClass
public static void stop() {
container.close();
}
@Before
public void inject() throws NamingException {
container.getContext().bind("inject", this);
}
@Test
public void test() {
// TODO
}
}
Run Code Online (Sandbox Code Playgroud)
这些是我的maven dependecies:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId> …Run Code Online (Sandbox Code Playgroud) 我正在学习JAX-RS,并且喜欢将URL返回到响应中的其他相关操作.使用Apache TomEE JAX-RS 1.5.1,由于某种原因,注入UriInfo实例提供的URL 始终使用"localhost"作为主机名.
我添加了一个@Context HttpServletRequest,并且getLocalName和getServerName值都匹配公共主机名.因此,此信息应该可供与TomEE捆绑在一起的CXF-RS运行时使用.目前还不清楚为什么它没有被使用.
下面是测试类和示例输出.如何让TomEE的嵌入式CXF-RS使用正确的主机名?或者,如果这不是正确的方法,我应该如何构建我可以在JAX-RS响应中返回的URL?
@Path("")
public class Test {
@GET
@Produces({MediaType.TEXT_PLAIN})
public String defaultPage(@Context UriInfo uriInfo,
@Context HttpHeaders hh,
@Context HttpServletRequest httpServletRequest) {
StringBuilder response = new StringBuilder();
response.append("uriInfo.getAbsolutePath(): ");
response.append(uriInfo.getAbsolutePath());
response.append("\n");
response.append("uriInfo.getBaseUri(): ");
response.append(uriInfo.getBaseUri());
response.append("\n");
// snip the repetitive part...
response.append("httpServletRequest.getServerPort(): ");
response.append(httpServletRequest.getServerPort());
response.append("\n\n");
for (String header : hh.getRequestHeaders().keySet()) {
response.append(header);
response.append(":\n");
for (String value : hh.getRequestHeaders().get(header)) {
response.append("\t");
response.append(value);
response.append("\n");
}
}
return response.toString();
}
} …Run Code Online (Sandbox Code Playgroud) 我在IntelliJ IDEA 12.1.3 Ultimate中有一个简单的RESTful服务.
我测试过了.有用.现在我想为这个服务创建一个Java客户端,需要一个WADL.
每在说明http://wiki.jetbrains.net/intellij/RESTful_WebService,我右键点击我的课,去"Web服务- > REST Web服务"才发现菜单项禁用"从Java代码生成WADL".
我做错了什么?
这是代码:
package com.mybiz;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/greeting")
public class Greeter {
@GET
@Produces("text/plain")
public String hello() {
return "Hi!";
}
}
Run Code Online (Sandbox Code Playgroud)
更新
似乎使用TomEE作为应用程序服务器会禁用此功能.我猜测应用服务器是WADL生成的地方,我没有使用IntelliJ理解的应用服务器.
我对吗?如果我切换应用程序服务器它会工作吗?我应该使用什么应用服务器?
我一直在努力让Tomee 1.5.2 JAX-RS与杰克逊合作.我想我已经尝试了100种方法.
这是我的最后一次尝试:
我在conf/system.properties中添加了以下内容:
openejb.cxf.jax-rs.providers = org.codehaus.jackson.jaxrs.JacksonJsonProvider, org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider
Run Code Online (Sandbox Code Playgroud)
我在Tomee的lib文件夹中添加了:
我在一个干净的NetBeans Maven Web项目中有一个简单的JAX-RS类.Mirc是一个名字和车的POJO.
...imports
@Path("")
public class MyJson {
@GET
@Produces(APPLICATION_JSON)
public Object myMeth() {
return new Mirc("Peter", "BMW");
}
Run Code Online (Sandbox Code Playgroud)
我一直得到"没有为响应类myclass找到消息正文编写器".
我错过了什么?我怎样才能让它发挥作用?我已经检查了stackoverflow上的所有帖子但没有成功.
我真的很感激一些帮助.谢谢.
我已经在 Eclipse 中包含了 TomEE,以便开始开发动态 Web 项目(我还是新手)。
在将项目添加到 TomEE 服务器之前,我可以毫无问题地启动它。
但是当我将项目添加到服务器并尝试运行它时,我收到错误: java.lang.IllegalArgumentException: Unsupported class file major version 58
web.xml文件以确保 servlet 映射正常package my.test.project;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
out.println("Hello this is a test");
out.close();
}
}
Run Code Online (Sandbox Code Playgroud)
我的 JEE 6 应用程序使用 CDI 以及带有嵌入式 tomee (1.7.2) 的 Arquillian 来测试它。在具有多个测试方法的测试类中,同一个 Request Scoped Bean 实例被注入到多个测试方法中。当应用程序部署在独立的 tomee plus 1.7.2 上时,不会出现该问题。
根据arquillian 文档,请求范围的 bean 实例只能用于一种测试方法。不幸的是 tomee 嵌入了自己,Arquillian 文档中没有提到它。这是 tomee 嵌入的已知限制吗?如果没有,如何修复?
服务等级:
@RequestScoped
public class SomeService
{
private String user;
public String execute(final String pNewUser)
{
if(user == null){
user = pNewUser;
}
return user;
}
}
Run Code Online (Sandbox Code Playgroud)
测试级:
@RunWith(Arquillian.class)
public class TestCase
{
@Inject
private SomeService someService;
@Deployment
public static WebArchive createDeployment()
{
return DefaultMicroDeploymenCreator.createDefaultMicroDeplymentWithFileName("TestCase.war");
}
@Test
public void testFirstTestMethod() throws …Run Code Online (Sandbox Code Playgroud) 关于TomEE和使用tomee.xml中指定的数据源,我有一个奇怪的问题。可能值得注意的是,我正在使用Netbeans,TomEE和MySQL。在Ubuntu 13.04上运行(最新的Xubuntu)
tomee.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<tomee>
<Resource id="booktablesDS" type="DataSource">
JdbcDriver com.mysql.jdbc.Driver
JdbcUrl jdbc:mysql:localhost:3306/book_tables
UserName juser
Password jpassword
JtaManaged true
</Resource>
</tomee>
Run Code Online (Sandbox Code Playgroud)
和一个小的代码片段,测试连接池:
@Resource DataSource booktablesDS;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Connection c = booktablesDS.getConnection();
Statement stmt = c.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM BOOKS");
Run Code Online (Sandbox Code Playgroud)
我从TomEE获得的输出是:
SEVERE: null
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
Run Code Online (Sandbox Code Playgroud)
完整的堆栈跟踪如下。
May 06, 2013 11:08:53 AM org.apache.catalina.util.LifecycleBase start
INFO: The start() method …Run Code Online (Sandbox Code Playgroud) 我在使用带有TomEE服务器的Jersey运行简单的RESTful Web服务时遇到了一些问题.(这是我正在遵循的教程:http://www.vogella.com/tutorials/REST/article.html虽然我使用Maven作为我的依赖项,而TomEE JAX-RS作为我的服务器).当我运行服务器时,我收到以下错误:
org.apache.openejb.OpenEJBException: Unable to load servlet class: org.glassfish.jersey.servlet.ServletContainer: org.glassfish.jersey.servlet.ServletContainer
at org.apache.openejb.config.AnnotationDeployer$ProcessAnnotatedBeans.deploy(AnnotationDeployer.java:2113)
at org.apache.openejb.config.AnnotationDeployer$ProcessAnnotatedBeans.deploy(AnnotationDeployer.java:1843)
at org.apache.openejb.config.AnnotationDeployer.deploy(AnnotationDeployer.java:360)
at org.apache.openejb.config.ConfigurationFactory$Chain.deploy(ConfigurationFactory.java:401)
at org.apache.openejb.config.ConfigurationFactory.configureApplication(ConfigurationFactory.java:962)
at org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:1214)
at org.apache.tomee.catalina.TomcatWebAppBuilder.configureStart(TomcatWebAppBuilder.java:1087)
at org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:130)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5378)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
servlet类派生自我的web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>RestTest</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Register resources and providers under com.vogella.jersey.first package. -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.vogella.jersey.first</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> …Run Code Online (Sandbox Code Playgroud) 我从未配置过 activemq,我只是使用 TomEE Plus 1.7.1 中的完全默认配置,并且它运行良好。我使用 JMS 进行异步电子邮件发送。现在我想使用调度程序支持,如下所示:
...
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY,
delayMinute * 60000);
...
Run Code Online (Sandbox Code Playgroud)
但消息并没有延迟。我读到 SchedulerSupport 应该在 xml 文件(可能是 activemq.xml (?))中打开,但我没有这样的文件。
我在 tomee.xml 中尝试了这个,但它不起作用:
<Resource id="myActiveMQResourceAdapter" type="ActiveMQResourceAdapter">
schedulerSupport = true
</Resource>
Run Code Online (Sandbox Code Playgroud)
我应该将 SchedulerSupport = true 配置属性放在哪里?我不想宣布新的经纪人或任何其他事情。只是我想使用默认设置加上调度程序支持。
我正在尝试在我的服务器上启用 CORS。它同时托管 Apache HTTPD 和 Apache Tomee。HTTPD 配置为:
SetEnvIf Origin "^https://(.+\.)?my-domain.com$" allowed_origin=$0
Header always set Access-Control-Allow-Origin %{allowed_origin}e env=allowed_origin
Header set Access-Control-Allow-Credentials "true"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS, HEAD, PUT, DELETE, PATCH"
Header set Access-Control-Allow-Headers "accept,x-requested-method,origin,x-requested-with,x-request,cache-control,content-type"
Header set Access-Control-Max-Age "600"
Run Code Online (Sandbox Code Playgroud)
和我的 Tomee web XML:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Accept-Language,Keep-Alive</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,OPTIONS,PUT,PATCH,DELETE</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
我的问题是我Access-Control-Allow-Credentials在对预检选项请求的响应中获得了两次标题:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://my-origin.my-domain.com
Access-Control-Allow-Origin: https://my-origin.my-domain.com
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 600
Access-Control-Allow-Methods: GET, POST, OPTIONS, HEAD, PUT, …Run Code Online (Sandbox Code Playgroud)