gpt4 book ai didi

java - org.apache.catalina.core.StandardContext.startInternal 一个或多个监听器启动失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:12:17 37 4
gpt4 key购买 nike

我在 Java/Spring/ Apache Cxf 上工作网络应用程序,突然间,当我进行了一些明显幼稚的更改时出现错误,

25-Aug-2017 11:48:43.036 INFO [RMI TCP Connection(2)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
log4j:WARN No appenders could be found for logger (org.apache.cxf.common.logging.LogUtils).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
25-Aug-2017 11:48:43.540 SEVERE [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
25-Aug-2017 11:48:43.554 SEVERE [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors
[2017-08-25 11:48:43,586] Artifact jaxrs-tutorials:war exploded: Error during artifact deployment. See server log for details.
25-Aug-2017 11:48:49.258 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/Applications/Tomcat-8.5.16/webapps/manager]
25-Aug-2017 11:48:49.310 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/Applications/Tomcat-8.5.16/webapps/manager] has finished in [51] ms

我猜这是主要的 info的错误,
25-Aug-2017 11:48:43.540 SEVERE [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
25-Aug-2017 11:48:43.554 SEVERE [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors

提供了项目结构,

enter image description here
config目录用于 Java annotation based config下面提供了代码。
AppConfig文件,
@Configuration
@ComponentScan(AppConfig.SERVICE_PACKAGE)
public class AppConfig {

public static final String BASE_PACKAGE = "mobi.puut";
public static final String SERVICE_PACKAGE = BASE_PACKAGE + ".services";
private static final String RESOURCES_PACKAGE = BASE_PACKAGE + ".rest";
private static final String PROVIDER_PACKAGE = BASE_PACKAGE + ".rest.provider";

public static final String API_BASE = "/api/*";

@ApplicationPath("/")
public class JaxRsApiApplication extends Application {
}

@Bean(destroyMethod = "shutdown")
public SpringBus cxf() {
return new SpringBus();
}

@Bean
@DependsOn("cxf")
public Server jaxRsServer(ApplicationContext appContext) {
JAXRSServerFactoryBean factory = RuntimeDelegate.getInstance().createEndpoint(jaxRsApiApplication(), JAXRSServerFactoryBean.class);
factory.setServiceBeans(restServiceList(appContext));
factory.setAddress("/" + factory.getAddress());
factory.setProviders(restProviderList(appContext, jsonProvider()));
return factory.create();
}

@Bean
public JaxRsApiApplication jaxRsApiApplication() {
return new JaxRsApiApplication();
}

@Bean
public JacksonJsonProvider jsonProvider() {
return new JacksonJsonProvider();
}

private List<Object> restServiceList(ApplicationContext appContext) {
return RestServiceBeanScanner.scan(appContext, AppConfig.RESOURCES_PACKAGE);
}

private List<Object> restProviderList(final ApplicationContext appContext,
final JacksonJsonProvider jsonProvider) {
final List<Object> providers = RestProviderBeanScanner.scan(appContext, PROVIDER_PACKAGE);
providers.add(jsonProvider);
return providers;
}

}
WebInitializer提供,
public class WebAppInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.addListener(new ContextLoaderListener(createWebAppContext()));
addApacheCxfServlet(servletContext);
}

private void addApacheCxfServlet(ServletContext servletContext) {
CXFServlet cxfServlet = new CXFServlet();

ServletRegistration.Dynamic appServlet = servletContext.addServlet("CXFServlet", cxfServlet);
appServlet.setLoadOnStartup(1);

Set<String> mappingConflicts = appServlet.addMapping(AppConfig.API_BASE);
}

private WebApplicationContext createWebAppContext() {
AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
appContext.register(AppConfig.class);
return appContext;
}

}

我在平台上看到了类似的问题,但这些问题对我没有帮助,而且我没有多少信息可以解决这个问题。

我如何使用 logger获取更多信息以及我应该在哪里使用它们?此外,任何有关解决问题的见解都会有所帮助。我已经更新了 JAR带有 mvn clean install 的文件和 mvn idea:idea命令。
UPDATE Tomcat Localhost Log
enter image description here
Tomcat Catalina Log
enter image description here

最佳答案

我想写一个关于这个问题的详细答案以及我解决问题所遵循的步骤。

A. 没有足够的日志信息。我查了一下POM并找到了这个,

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

我已排除日志以支持 SLF4J我刚刚删除了排除 XML 标记以获取更多日志信息。于是,就变成这样了
        <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>

B. 现在,我得到了日志信息。我有这样的错误信息,
Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'userService' for bean class [mobi.puut.services.UserServiceImpl] conflicts with existing, non-compatible bean definition of same name and class [mobi.puut.services.UserService2Impl]

您会收到 ConflictingBeanDefinitionException用于创建具有相同名称的 bean。虽然我对 Spring 有一些经验,我需要用 Apache Cxf 创建一个项目因此,为此目的克隆一个演示项目。他们有一个相同的实体 User和相同 definition - interface和相同 implementation其中。虽然我有 refactored对于项目中的所有类并且似乎没有明显错误,我仍然有一个问题 - 我保留相同的 bean 名称 "userService在接口(interface)的 2 个实现中。
User2实体中的类,
public class User2 {

private Integer id;
private String name;

public User2() {
}

public User2(Integer id, String name) {
this.id = id;
this.name = name;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}

@Override
public String toString() {
return String.format("{id=%s,name=%s}", id, name);
}
}
User实体中的类,
@Entity
@Table(name = "users")
public class User {

@Id
@Column
@NotNull
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@NotNull
@Column(name = "name")
@Size(min = 5, max = 45, message = "Name must be between 5 and 45 characters.")
private String name;

public User() {

}

public User(int id, String name) {
super();
this.id = id;
this.name = name;
}

public User(String name) {
this.name = name;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;

User user = (User) o;

if (getId() != user.getId()) return false;
return getName().equals(user.getName());
}

@Override
public int hashCode() {
int result = getId();
result = 31 * result + getName().hashCode();
return result;
}

@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
services中的接口(interface)目录,
public interface IUserService2 {

Collection<User2> getUsers();

User2 getUser(Integer id);

Response add(User2 user);
}



public interface IUserService {

List<User> getCurrentStatuses();

void create(User user);

List<User> getAllUsers();
}
services内部接口(interface)的实现指示,
@Service("userService")
public class UserService2Impl implements IUserService2 {

private static Map<Integer, User2> users = new HashMap<Integer, User2>();

static {
users.put(1, new User2(1, "foo"));
users.put(2, new User2(2, "bar"));
users.put(3, new User2(3, "baz"));
}

public UserService2Impl() {
}

@Override
public Collection<User2> getUsers() {
return users.values();
}

@Override
public User2 getUser(Integer id) {
return users.get(id);
}

@Override
public Response add(User2 user) {
user.setId(users.size()+1);
users.put(user.getId(), user);

//do more stuff to add user to the system..
return Response.status(Response.Status.OK).build();
}

}


@Service("userService")
public class UserServiceImpl implements IUserService {

@Autowired
@Qualifier("userDao")
public IUserDao userDao;

public List<User> getCurrentStatuses() {
return userDao.getAllUsers();
}

public void create(User user) {
userDao.saveOrUpdate(user);
}

public List<User> getAllUsers() {
List<User> users = userDao.getAllUsers();

if (Objects.isNull(users)) {
return null;
}
return users;
}
}

而且,还有 error - 我注释了 2 个具有相同 bean 名称的类 "userService" .我不得不像这样改变它来为 bean 提供一个不同的名称,
@Service("user2Service")
public class UserService2Impl implements IUserService2 {

// some code
}

而且,那个错误消失了。总之,错误 ConflictingBeanDefinitionException由于 2 个 bean 同名,我只需要提供不同的名称。

C. 我还有事情要解决。之后,当我运行程序时,我得到
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userService': Unsatisfied dependency expressed through field 'userDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'mobi.puut.database.IUserDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=userDao)}


// some consequent error messages not necessay to solve the issue

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'mobi.puut.database.IUserDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=userDao)}

这里的错误是 UnsatisfiedDependencyException并说它无法创建名称为 userService 的 bean .好的,这是我拥有并集成到项目中的代码。通过字段表示的 Unsatisfied 依赖,即 userDao . userDaoIUserDao的接口(interface)实例它是 @autowired像这样,
    @Autowired
public IUserDao userDao;

这是代码的更多见解,
@Service("userService")
public class UserServiceImpl implements IUserService {

@Autowired
public IUserDao userDao;


public List<User> getCurrentStatuses() {
return userDao.getAllUsers();
}

public void create(User user) {
userDao.saveOrUpdate(user);
}

public List<User> getAllUsers() {
List<User> users = userDao.getAllUsers();

if (Objects.isNull(users)) {
return null;
}
return users;
}
}

我在 database 中有一个接口(interface)目录和随后为用户实现的界面。接口(interface)名称是 IUserDao看起来
soemthing like this, 


public interface IUserDao {

boolean create(User user);

void saveOrUpdate(User user);

boolean create(List<User> users);

List<User> getAllUsers();

User getById(int id);
}

而且,实现,
@Repository("userDao")
public class UserDaoImpl implements IUserDao {

@Autowired
private SessionFactory sessionFactory;

// the HQL queries

}

错误消息的后续部分是 NoSuchBeanDefinitionException并且应用程序没有找到 IUserDao 类型(类)的合格 bean .我有所有 HQL查询在执行 IUserDao并且代码之前完美运行。

我不得不花点时间思考,最后,我有一个直觉,可能是 database层是 NOT集成到应用程序中。这是 configuration我用了,
public class WebAppInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.addListener(new ContextLoaderListener(createWebAppContext()));
addApacheCxfServlet(servletContext);
}

private void addApacheCxfServlet(ServletContext servletContext) {
CXFServlet cxfServlet = new CXFServlet();

ServletRegistration.Dynamic appServlet = servletContext.addServlet("CXFServlet", cxfServlet);
appServlet.setLoadOnStartup(1);

Set<String> mappingConflicts = appServlet.addMapping(AppConfig.API_BASE);
}

private WebApplicationContext createWebAppContext() {
AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();

// register all the config classes here
appContext.register(AppConfig.class);
return appContext;
}

}

显然,在 WebInitializer中集成了无数据库代码。 .我写了一个新类提供了 database connection的所有信息和 hibernate integration看起来像,
@Configuration
@EnableWebMvc
@EnableTransactionManagement
@ComponentScan(basePackages = {"mobi.puut.database"})
public class DatabaseConfig {

@Bean
public LocalSessionFactoryBean sessionFactory() {

// mobi.puut.entities
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(
new String[]{"mobi.puut.entities"});
sessionFactory.setHibernateProperties(hibernateProperties());

return sessionFactory;
}

@Bean
@Autowired
public HibernateTransactionManager transactionManager(
SessionFactory sessionFactory) {

HibernateTransactionManager txManager
= new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);

return txManager;
}

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}

@Bean
public DataSource dataSource() {

DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");

// dataSource.setUrl("jdbc:mysql://localhost:3306/wallet?createDatabaseIfNotExist=true");
dataSource.setUrl("jdbc:mysql://localhost:3306/Wallet");
dataSource.setUsername("testuser");
dataSource.setPassword("testpassword");

return dataSource;
}

Properties hibernateProperties() {

Properties properties = new Properties();
// properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
return properties;
}
}

并且,然后终于融入了 WebInitializer .这是我以前用的代码 registered之前在 WebInitializer 中的配置,
appContext.register(AppConfig.class);

更新了行,
appContext.register(AppConfig.class, DatabaseConfig.class);

最后,一切正常。所以, config目录看起来像,

enter image description here
SUMMERY
我不得不通过 3 个错误来解决这个问题,
i. ConflictingBeanDefinitionException
ii. UnsatisfiedDependencyException
iii. NoSuchBeanDefinitionException
ConflictingBeanDefinitionException -> 2 个同名 bean
UnsatisfiedDependencyException -> 有 bean (= "userDao")在不正确使用的类中
NoSuchBeanDefinitionException -> 代码是正确的,但需要在配置中添加 datbase 层,所以 Spring IoC找到 bean 。

我真诚地希望这会帮助一些人。

关于java - org.apache.catalina.core.StandardContext.startInternal 一个或多个监听器启动失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45875230/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com