小编sat*_*shi的帖子

单元测试依赖于请求上下文的方法

我正在为包含以下行的方法编写单元测试:

String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

java.lang.IllegalStateException:找不到线程绑定请求:您是指实际Web请求之外的请求属性,还是处理最初接收线程之外的请求?如果您实际在Web请求中操作并仍然收到此消息,则您的代码可能在DispatcherServlet/DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter来公开当前请求.

原因很明显 - 我没有在请求上下文中运行测试.

问题是,如何在测试环境中测试包含对依赖于请求上下文的方法的调用的方法?

非常感谢你.

spring spring-mvc

54
推荐指数
3
解决办法
3万
查看次数

使用Elastic Beanstalk部署的应用程序上的弹性IP

我对Amazazon Web Services提供的弹性IP服务的使用感到有些困惑.我想主要的想法是,我可以按照这个简单的过程切换到新版本的Web应用程序,无需停机:

  1. 在新的EC2实例上部署新版本
  2. 正确配置新版本并使用登台DB进行测试
  3. 经过适当的测试,使这个新版本使用实时数据库
  4. 将弹性IP与此实例相关联
  5. 终止所有无用的服务(登台DB和旧的EC2实例)

这是部署新版Web应用程序的常用方法吗?

现在,如果应用程序在更多实例上扩展,该怎么办?我在Elastic Beanstalk设置中配置了自动缩放,这创建了一个负载均衡器(我可以在AWS管理控制台的EC2部分看到).问题是我显然无法将弹性IP与负载均衡器相关联,我必须将其与现有实例相关联.我应该将它与哪个实例相关联?我糊涂了...

对不起,如果有些问题可能听起来很愚蠢,但我只是程序员,这是我第一次建立云系统.

谢谢!

amazon-ec2 amazon-web-services amazon-elastic-beanstalk

41
推荐指数
2
解决办法
2万
查看次数

让JPA/Hibernate复制"ON DELETE SET NULL"功能

我已经能够让JPA/Hibernate ON DELETE CASCADE成功复制功能(看起来像默认行为),但我现在正在尝试复制ON DELETE SET NULL功能,我遇到了问题.

这是我的两个班级:

@Entity
@Table(name = "teacher")
public class Teacher
{
    @Id
    @GeneratedValue
    @Column(name = "id", nullable = false, length = 4)
    private int id;

    @OneToMany(mappedBy = "teacher")
    private List<Student> studentList;

    // ...
}
Run Code Online (Sandbox Code Playgroud)
@Entity
@Table(name = "student")
public class Student
{
    @Id
    @GeneratedValue
    @Column(name = "id", nullable = false, length = 4)
    private int id;

    @ManyToOne(optional = true)
    @JoinColumn(name = "teacher_id", nullable = true)
    private Teacher teacher;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

当我尝试删除教师时,会出现以下错误: …

java hibernate jpa

32
推荐指数
2
解决办法
2万
查看次数

Amazon Web Services上的会话粘性

我对亚马逊网络服务上会话粘性的使用感到有些困惑.当我使用Amazon Elastic Beanstalk部署我的Java Web应用程序时,我可以选择启用会话粘性,然后指定cookie过期时间.

我的应用程序使用cookie作为会话(JSESSIONID)以及其他小东西.大多数网站只有在登录后才能访问(我使用Spring安全管理它).该网站最多可运行25个小型EC2实例.

我应该启用会话粘性吗?如果我不启用它,是否意味着我可以突然登出,因为负载均衡器将我带到另一台服务器(而不是验证我的服务器)?如果我启用会话粘性,当验证我的服务器关闭时,我是否会被注销?基本上,为什么以及何时应该使用会话粘性?

非常感谢你.

amazon-ec2 amazon-web-services amazon-elb amazon-elastic-beanstalk

17
推荐指数
1
解决办法
8986
查看次数

在Spring中访问webapp文件夹中的文件/目录

我在Spring方面缺乏经验,现在我需要做的就是访问并获取webapp文件夹中的文件和文件夹的引用.这是我的相关项目层次结构:

-src
--main
---java (marked as source root)
----my
-----package
------controller
-------Home.java
---webapp
----images
-----avatars
Run Code Online (Sandbox Code Playgroud)

我在Home.java中的代码:

@Controller
@RequestMapping("/")
public class Home
{
    @RequestMapping(method = RequestMethod.GET)
    public String index(Model model,
                        HttpServletRequest request) throws Exception
    {
        String test1 = request.getSession().getServletContext().getRealPath("");
        String test2 = request.getSession().getServletContext().getRealPath("/");
        String test3 = request.getRealPath("");
        String test4 = request.getRealPath("/");
        String test5 = request.getSession().getServletContext().getRealPath(request.getServletPath());

        return "index";
    }
}
Run Code Online (Sandbox Code Playgroud)

所有5个请求都返回null.难道我做错了什么?

web.xml中:

<web-app 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"
         version="2.5">

    <display-name>Test</display-name>

    <servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param> …
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc

15
推荐指数
2
解决办法
7万
查看次数

AWS上的memcached-session-manager

我有一个在Amazon Web Services上运行的网站,它使用Elastic Beanstalk部署并运行至少2个EC2微实例.自动扩展策略已到位,因此可以根据网站中的流量进行扩展和缩小.由于这种自动扩展策略,我想避免使用粘性会话,因此我使用的是memcached-session-manager.我正在使用Amazon ElastiCache(小实例)作为memcached服务器.

context.xml中的配置如下:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="sessions.myinstancecode.0001.use1.cache.amazonaws.com:11211"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="none"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
Run Code Online (Sandbox Code Playgroud)

当流量较低(即少于10个在线用户)时,此工作正常,但有时会导致EC2实例重新启动.您可以想象,如果网站当前正在两个实例上运行并且他们都决定同时重新启动,那么该网站将无法访问,这是一个大问题.这些是在EC2实例决定重新启动之前在Amazon S3上轮换的tail_catalina.log中的最后一行:

Jun 13, 2012 12:32:27 AM de.javakaffee.web.msm.BackupSessionTask handleException
WARNING: Could not store session 42F9761AC24F826E1FC3F2A834FBF442 in memcached.
Note that this session was relocated to this node because the original node was not available.
net.spy.memcached.internal.CheckedOperationTimeoutException: Timed out waiting for operation - failing node: sessions.myinstancecode.0001.use1.cache.amazonaws.com/10.194.23.99:11211
    at net.spy.memcached.internal.OperationFuture.get(OperationFuture.java:73)
    at de.javakaffee.web.msm.BackupSessionTask.storeSessionInMemcached(BackupSessionTask.java:230)
    at de.javakaffee.web.msm.BackupSessionTask.doBackupSession(BackupSessionTask.java:195)
    at de.javakaffee.web.msm.BackupSessionTask.call(BackupSessionTask.java:120)
    at de.javakaffee.web.msm.BackupSessionTask.call(BackupSessionTask.java:51)
    at de.javakaffee.web.msm.BackupSessionService$SynchronousExecutorService.submit(BackupSessionService.java:339)
    at de.javakaffee.web.msm.BackupSessionService.backupSession(BackupSessionService.java:198)
    at de.javakaffee.web.msm.MemcachedSessionService.backupSession(MemcachedSessionService.java:967)
    at de.javakaffee.web.msm.SessionTrackerValve.backupSession(SessionTrackerValve.java:226)
    at de.javakaffee.web.msm.SessionTrackerValve.invoke(SessionTrackerValve.java:128)
    at …
Run Code Online (Sandbox Code Playgroud)

memcached session-replication session-management amazon-web-services amazon-elasticache

12
推荐指数
1
解决办法
5850
查看次数

HibernateJpaVendorAdapter的generateDdl不会改变表

我正在使用Spring + JPA + Hibernate开发一个网站.在持久性配置(JPA + Hibernate)中,我将HibernateJpaVendorAdapter的generateDdl属性设置为true,实际上新实体正确地在DB中创建新表.

但是,一旦创建了表,如果我向实体添加一个属性,我希望HibernateJpaVendorAdapter可以改变表并添加列.这种情况并没有发生,这很奇怪,因为在Java AbstractJpaVendorAdapter的setGenerateDdl方法文档中有:"设置是否在EntityManagerFactory初始化之后生成DDL,创建/ 更新所有相关表."

JPA + Hibernate配置:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${db.driverClassName}" />
    <property name="url" value="${db.url}" />
    <property name="username" value="${db.username}" />
    <property name="password" value="${db.password}" />
</bean>

<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
    <property name="showSql" value="${db.showSql}" />
    <property name="generateDdl" value="${db.generateDdl}" />
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaVendorAdapter" ref="jpaAdapter" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
        </props>
    </property>
    <property name="dataSource" ref="dataSource" />
</bean>
Run Code Online (Sandbox Code Playgroud)

persistence.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<persistence
        xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
   http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" …
Run Code Online (Sandbox Code Playgroud)

hibernate alter

8
推荐指数
2
解决办法
2万
查看次数

Spring + JPA有很多很多关系

我是Spring的新手,我正在尝试按照我的预期建立多对多的关系.关系工作正常,创建表并正确插入数据.我期望的是,当我清空List(即我从"Group"类型的对象中清空ArrayList"users")时,我希望系统从数据库中删除关系 - 但事实并非如此.

我有以下课程:

@Entity
@Table(name = "`group`")
public class Group
{
    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private String name;

    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(
            name = "`user_has_group`",
            joinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id")
    )
    private List<User> users = new ArrayList<User>();

    ...
}

@Entity
@Table(name = "`user`")
public class User
{
    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private String name; …
Run Code Online (Sandbox Code Playgroud)

spring many-to-many jpa list

7
推荐指数
1
解决办法
5163
查看次数

使用PostgreSQL,为什么Hibernate/JPA不会创建级联约束?

我有一个实体Bar:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "bar")
private Set<Foo> fooSet;
Run Code Online (Sandbox Code Playgroud)

一个实体Foo:

@ManyToOne(optional = false)
@JoinColumn(name = "bar_id")
private Bar bar;
Run Code Online (Sandbox Code Playgroud)

Hibernate在foo.bar - > bar.id上创建了外键约束,但它没有指定ON DELETE CASCADE.为什么不?有没有办法实现它?

或者我可以ON DELETE CASCADE在DB中手动添加(并禁用DDL生成),这是一个好习惯吗?而且,我是否必须以某种方式修改我的代码让Hibernate知道数据库会自动删除相关记录?

谢谢.

更新 - 这是我的JPA/Hibernate/PostgreSQL配置:

<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <constructor-arg>
        <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="org.postgresql.Driver" />
            <property name="url" value="jdbc:postgresql://localhost:5432/my_db" />
            <property name="username" value="my_username" />
            <property name="password" value="my_password" />
        </bean>
    </constructor-arg>
</bean>
<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
    <property name="showSql" value="true" />
    <property …
Run Code Online (Sandbox Code Playgroud)

java postgresql hibernate jpa foreign-keys

7
推荐指数
1
解决办法
8321
查看次数

外部API的静态IP

我需要为我的网站使用外部 Web API,他们询问我请求来自的 IP 地址是什么。关键是我的 Web 应用程序可以在更多 Amazon EC2 实例上进行扩展,因为它是使用配置了自动扩展的 Elastic Beanstalk 进行部署的。

解决问题的最佳方案是什么?

我能想到的最好的办法是设置一个微实例,将弹性 IP 与其关联并将其用作 HTTP 代理。有更好的解决方案吗?

我确信我不是唯一一个遇到这个问题的人,但我在 stackoverflow 上找不到像我这样的问题。许多电子商务网站通常使用外部支付系统,该系统要求请求来自一个或多个特定的 IP 地址......

谢谢。

更新- 感谢@David,我确实使用 Apache 模块 mod_proxy 设置了 HTTP 代理。如何配置它以便只有我的 EC2 实例可以访问它?我的 EC2 实例是在自动扩展时动态创建的。

ProxyRequests On                                                                                                                                                                   

<Proxy *>                                                                                                                                                                          
 Order deny,allow                                                                                                                                                                  
 Deny from all                                                                                                                                                                     
 Allow from ???                                                                                                                                               
</Proxy>
Run Code Online (Sandbox Code Playgroud)

amazon-ec2 amazon-web-services amazon-elastic-beanstalk

5
推荐指数
1
解决办法
1222
查看次数