小编Koi*_*oer的帖子

从两个不同的数据库中检索相同DTO的信息

我试着通过一个简短的例子尽可能地简化这个.

我们有两个数据库,一个在MSSQLServer中,另一个在进行中.我们有一个用户DTO,因为它显示在Web应用程序的UI表中.

User

int, id
String, name
String, accountNumber
String, street
String, city
String, country
Run Code Online (Sandbox Code Playgroud)

现在,此DTO(实体)不仅存储在一个数据库中,同一用户的某些信息(字段)存储在一个数据库中,一些信息存储在另一个数据库中.

MSsql

Table user
int, id
String, name
String, accountNumber


Table userModel
int, id
String, street
String, city
String, country
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,密钥是连接两个数据库中两个表的唯一部分,正如我之前所说的那样,它们不在同一个数据库中而且没有使用相同的数据库供应商.

我们需要为每列排序UI表.显然,我们需要使用来自两个数据库的信息创建用户dto.

我们此时的提议是,如果用户想要使用街道字段应用排序,我们在Progress数据库中运行查询并使用此结果集获取页面(使用分页)并直接转到带有这些键的MSSQLServer User表并运行另一个查询提取丢失的信息并将其保存到我们的DTO并将其传输到UI.使用implies在一个数据库中运行查询,然后根据第二个数据库中返回的键执行其他查询.

数据库的顺序可能会发生变化,具体取决于用户要应用排序的列(字段).

从技术上讲,我们将创建一个充当外观的jparepository,并根据字段在正确的数据库中创建进程.

我的问题是:在这种情况下有一种常用的模式,我们使用spring,所以spring可能有一些开箱即用的功能来支持这个要求,如果可以使用jparepositories(我有由于我们将使用两个不同的实体管理器,每个数据库一个,因此对它有几个疑问.

注意:不能将数据从一个数据库移动到另一个数据库.

java spring hibernate jpa spring-data-jpa

16
推荐指数
1
解决办法
1029
查看次数

每层集成测试是一个好习惯吗?

我有一个使用spring-mvc的应用程序,基本上我们有一个表示层(控制器),服务层(业务单元,帮助器),集成层和数据访问层(jdbc/jpa存储库),我们希望确保使用未来的测试除了代码之外不会破坏以前工作的任何东西,为此我们使用单元测试(mockito)和集成测试(spring-test,spring-test-mvc).

每个类/组件进行单元测试,基本上我们试图对输入输入和这些组件中的可能流程进行良好的覆盖,这个动作工作正常,这里没有疑问,因为单元测试是关于确保单元按预期工作.

集成测试是不同的故事和非常有争议的一个,因为现在我们有时使用相同的场景来设计我们的单元测试但是使用真实平台等可以获得整个系统,但我对这里的最佳实践有疑问.

  1. 由于我们有一个控制器,服务,数据层一种方法是每层IT,例如我们有UserService类,我们将有UserServiceTest,它将是Unit测试和UserServiceIT,但是可维护性不理想,我觉得有时我们会重复相同的测试场景,但现在使用真实系统.这种做法真的有意义吗或在哪种情况下这是有道理的?如果我们已经在课堂上有100%的测试覆盖率进行单元测试,为什么我们需要IT来实现这一目标,那么我们认为这只是为了确保真正的组件能够启动?有意义的是拥有所有相同的场景或哪些是一个很好的标准来决定?

  2. 其他方法只是通过集成测试来处理最重要的测试用例,而只是来自控制器层,这意味着调用REST服务并验证JSON输出.这够了吗?我们不需要在其他层中验证更多东西吗?我知道调用真正的REST api将在所有层(控制器,服务,dao)下使用,但这已经足够了吗?你会在这里说些什么?

  3. 如果我们有一个帮助类我不认为有单位和IT是有意义的,因为大多数方法只有一个目的我觉得单元测试就够了,你觉得相同吗?

  4. 数据层中的某些类可以使用Criteria API,QueryDSL用于那些我使用IT的人,因为在某些情况下单元测试非常困难,这是一个有效的理由吗?

我正在努力获得最佳方法,技巧和实践,使确保系统完整性的任务成为真正有价值的过程,同时牢记这些东西的可维护性.

java spring integration-testing unit-testing spring-mvc

10
推荐指数
1
解决办法
1746
查看次数

运行Tomcat并使用自己的server.xml部署项目

我只想运行一个使用pom.xml在maven项目中配置的Web项目.它使用maven tomcat7-maven-plugin来部署Web应用程序工件,此时所有工作正常.

现在我想在tomcat配置中添加自己的server.xml和tomcat-users.xml.我读到我需要添加以下行.

 <serverXml>src/main/resources/tomcat/server.xml</serverXml>
 <tomcatUsers>src/main/resources/tomcat/tomcat-users.xml</tomcatUsers>
Run Code Online (Sandbox Code Playgroud)

这没关系.它现在正在运行,并且使用上面的配置文件部署了tomcat,但问题是> 那里没有部署Web应用程序工件(当我运行tomcat7:run时没有自动部署).看来插件没有检测到工件,只是启动tomcat服务器而不将工件添加到webapps只需使用新的配置文件.

我用这个配置.

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.0</version>
    <executions>
          <execution>
            <id>tomcat-run</id>
            <goals>
              <goal>exec-war-only</goal>
            </goals>
            <phase>package</phase>
           <configuration>
        <url>http://localhost:8080/web-services</url>
        <path>/web-services</path>
        <serverXml>src/main/resources/tomcat/server.xml</serverXml>
                <tomcatUsers>src/main/resources/tomcat/tomcat-users.xml</tomcatUsers>
                   <warRunDependencies>
                    <warRunDependency>
                     <dependency>
                        <groupId>com.koitoer.webservices</groupId>
                        <artifactId>web-services</artifactId>
                        <version>1.0-SNAPSHOT</version>
                        <type>war</type>
                      </dependency>
                    <contextPath>/web-services</contextPath>
                </warRunDependency>
              </warRunDependencies>
    </configuration>
    </execution>
        </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

但是tomcat开始部署webapp工件但不使用新的配置文件.

什么是正确的配置,我检查了这篇文章,但没有,这是可能的或我应该使用tomcat管理器手动添加war文件?

java tomcat maven

9
推荐指数
1
解决办法
9488
查看次数

Junit等于方法

我只是想知道是否有最佳实践或常用方法来测试对象中的equals实现.我的意思是被覆盖的测试方法.

public boolean equals(Object o)
Run Code Online (Sandbox Code Playgroud)

我确实使用了这样的逻辑.(假设数字和名称必须等于获得真)

Dog d1 = new Dog(1,"Alvin");
Dog d2 = new Dog(2,"Alvin");

Assert.assertFalse(d1.equals(null));
Assert.assertFalse(d1.equals(d2));
d2.setId(1);
d2.setName("Kelvin");
Assert.assertFalse(d1.equals(d2));
d2.setName("Alvin");
Assert.assertTrue(d1.equals(d2));
Assert.assertTrue(d1.equals(d1));
Run Code Online (Sandbox Code Playgroud)

但是当有很多字段时,这个任务非常庞大而且很无聊,所以我的问题是,是否有任何框架,工具,选项,任何使这更容易的东西,并且可以证明方法已被正确覆盖.谢谢.

我知道覆盖方法equals取决于你需要的逻辑,但也是测试用例创建,所以寻找一种标准方法来测试方法,避免测试用例中的大代码,如果存在明显或任何建议你可能有.

java testing junit equality equals

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

如何创建和使用具有Spring + JUnit Test Config注释的自定义注释?

我有大量的测试用例,它们运行Spring Junit支持,每个测试都有以下注释.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext.xml")
@TransactionConfiguration(transactionManager="transactionManager")
@Transactional
@ActiveProfiles("test")
Run Code Online (Sandbox Code Playgroud)

我没有在每个Test类上放置所有这些注释,而是想创建一个自定义注释并使用它.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext.xml")
@TransactionConfiguration(transactionManager="transactionManager")
@Transactional
@ActiveProfiles("test")

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface SpringJUnit4TestConfig {

}
Run Code Online (Sandbox Code Playgroud)

但是当我使用这个自定义注释弹簧注入根本没有发生.

@SpringJUnit4TestConfig
public class UserServiceTest
{
}
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

PS:但是JUnit的@RunWith和Spring的@Transactional,@ ContextConfiguration都有@ Inherited ..所以我认为它应该可行.但是现在我通过一个解决方法来完成它.创建了一个基于抽象的类,并在其上放置了所有这些注释,并扩展了该基类的测试用例.

java junit spring annotations

6
推荐指数
1
解决办法
1830
查看次数

同一WAR中的多个JAX-RS应用程序

我有

@ApplicationPath("/resourcesP")
public class RestfulPrediction extends Application {
    @Override
    public Set<Class<?>> getClasses() {
    Set<Class<?>> set = new HashSet<Class<?>>();
        set.add(PredictionsRS.class);
        return set;
    }
}
Run Code Online (Sandbox Code Playgroud)

@ApplicationPath("/resourcesA")
public class RestfulAdage extends Application {
    @Override
    public Set<Class<?>> getClasses() {
    Set<Class<?>> set = new HashSet<Class<?>>();
        set.add(Adages.class);
        return set;
    }
}
Run Code Online (Sandbox Code Playgroud)

两个不同的ApplicationPath和类如下.

@Path("/")
public class service.Adages {}

@Path("/")
public class webservices.PredictionsRS {}
Run Code Online (Sandbox Code Playgroud)

它们都在不同的ApplicationPath中声明.我正在使用Jersey,web.xml中的配置看起来像

  <servlet>  
    <servlet-name>jersey</servlet-name>  
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>  
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>
            service
            webservices
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>  
Run Code Online (Sandbox Code Playgroud)

而且我得到了

严重:冲突的URI模板.URI模板/用于根资源类service.Adages和URI模板/转换为相同的正则表达式(/.*)?

为什么我有两个不同的ApplicationPath这个例外是在启动时出现的?

如果我在param-value中取出一个包有效,那么如果我更改了其中一个@Path注释,那么这对我的配置有问题吗?

我正在使用Jersey 1.10.谢谢大家.

java rest jax-rs jersey

6
推荐指数
1
解决办法
8301
查看次数

Spring Boot REST MVC 将具有不同字段名称的请求参数映射到对象

假设我想将一堆请求参数捕获为一个对象,如下所示:

@GetMapping("/")
public List<Item> filterItems(@Valid Filter filter){}
Run Code Online (Sandbox Code Playgroud)

Filter看起来像这样:

class Filter {
        public String status;
        public String start;
        public String end;
    }
Run Code Online (Sandbox Code Playgroud)

现在在 API 中请求参数名称state不再是status这样了?state=A&start=1&end=2。如何使这些请求参数映射到我的 Filter 对象而无需重命名status?我知道如果我有@RequestParam("state") String status它会起作用,但我希望它成为请求对象的一部分。

我尝试@JsonProperty('state')在字段中添加,但没有成功。

spring-mvc http-request-parameters spring-web spring-rest

5
推荐指数
0
解决办法
2862
查看次数