小编Ale*_*ndr的帖子

关闭JAX RS客户端/响应

目前尚不清楚是否必须关闭JAX RS Client / Response实例。如果必须,是否总是?

根据有关Client类的文档

调用此方法将有效地使客户端实例产生的所有资源目标无效。

WebTarget类没有任何invalidate()/ close()方法,但是Response类具有。根据文件

关闭基础消息实体输入流(如果可用并打开),并释放与响应关联的任何其他资源(例如,缓冲的消息实体数据)。

...应该在包含未使用的实体输入流的所有实例上调用close()方法,以确保正确清理与该实例关联的资源并防止潜在的内存泄漏。这是典型的客户端方案,在该方案中,应用程序层代码仅处理响应头,而忽略响应实体。

最后一段对我来说不清楚。“未消费的实体输入流”是什么意思?如果我从响应中获得InputSteam或String,是否应该显式关闭响应?

我们可以获得响应结果而无需访问Response实例:

Client client = ...;
WebTarget webTarget = ...;
Invocation.Builder builder = webTarget.request(MediaType.APPLICATION_JSON_TYPE);
Invocation invocation = builder.buildGet();
InputStream reso = invocation.invoke(InputStream.class);
Run Code Online (Sandbox Code Playgroud)

我正在使用RESTeasy实施,并且我希望响应将在resteasy实施内关闭,但我找不到它。谁能告诉我为什么?我知道Response类将实现Closeable接口, 但是即使知道使用Response,也不会关闭它。

java memory-leaks jax-rs

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

SQL查询优化

请比较以下内容:

INNER JOIN table1 t1 ON t1.someID LIKE 'search.%' AND 
                        t1.someID = ( 'search.' || t0.ID )
Run Code Online (Sandbox Code Playgroud)

INNER JOIN table1 t1 ON t1.someID = ( 'search.' || t0.ID )
Run Code Online (Sandbox Code Playgroud)

我被告知,第一种情况已经过优化.但是你知道,我无法理解为什么会这样.据我所知,第二个例子应该运行得更快.

我们使用Oracle,但我认为目前无关紧要.

请解释我是不是错了.

谢谢

sql oracle optimization

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

Spring Data Jpa项目使用ManyToMany关系时的生成查询

我有以下实体映射:

@Entity
@Table(name = "books")
public class Book implements Serializable {
    @ManyToMany
    @JoinTable(name="books2categories",
    joinColumns=@JoinColumn(name="book_id"),
    inverseJoinColumns=@JoinColumn(name="category_id"))
    Collection<Category> categories;
Run Code Online (Sandbox Code Playgroud)

...

@Entity
@Table(name = "categories")
public class Category implements Serializable {
    @ManyToMany(mappedBy="categories")
    private Collection<Book> books;
Run Code Online (Sandbox Code Playgroud)

看了BookRepository接口:

public interface BookRepository extends JpaRepository<Book, Long> {

    @Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE c IN (:categories)")
    List<Book> findByCategories(Collection<Category> categories);
Run Code Online (Sandbox Code Playgroud)

如果我在查询本身错了,请修复我.当我为该findByCategories方法运行测试时,我收到错误:

testFindByCategories(com.savdev.springmvcexample.repository.JpaBookRepositoryTest):org.hibernate.QueryParameterException:超出声明的ordinal参数数量的位置.请记住,序数参数是基于1的!位置:1; 嵌套异常是java.lang.IllegalArgumentException:org.hibernate.QueryParameterException:超出声明的ordinal参数数量的位置.请记住,序数参数是基于1的!职位:1

我有哪个选项可以解决它?

第二,我可以调试将参数传递给查询的Spring Data Jpa逻辑吗?我得到了Spring Data Jpa返回的代理,无法理解在哪里使用断点来调试这种行为.

更新:我通过使用(?1)以下方法修复了它:

@Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE …
Run Code Online (Sandbox Code Playgroud)

java spring many-to-many jpql spring-data-jpa

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

REST Jackson JsonDeserialize,升级后的StackOverflowError

在以前版本的jackson(1.9.2)中,以下代码运行良好:

import org.codehaus.jackson.map.JsonDeserializer;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.DeserializationContext;
...
@JsonDeserialize(using = RoleDeserializer.class)
public interface RoleDto {}

public class RoleDeserializer extends SomeSharedDeserializer<RoleDto> {}

public class SomeSharedDeserializer<T> extends JsonDeserializer<T> {
    @Override
    public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
    {
        return jp.readValueAs(getImplementation());
    }

    public Class<? extends T> getImplementation(){ ... returns some generated implementation of RoleDto }
}
Run Code Online (Sandbox Code Playgroud)

在我们迁移到最后一个jackson版本(Wildfly 8.2提供的1.9.13)后,我们得到了一个例外:

com.fasterxml.jackson.databind.JsonMappingException:无法构造RoleDto的实例,问题:抽象类型需要映射到具体类型,具有自定义反序列化器,或者使用其他类型信息进行实例化

好的,就像在jackson使用的新包装一样,我们将它们升级为:

import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer;
Run Code Online (Sandbox Code Playgroud)

解串器现在可见(先前的异常消失了),但是,我们得到了StackOverflowError异常.com.fasterxml.jackson.databind.ObjectMapper读取值(第3023行):

    DeserializationContext ctxt = createDeserializationContext(jp, cfg);
    JsonDeserializer<Object> deser = _findRootDeserializer(ctxt, valueType);
    // ok, let's get the …
Run Code Online (Sandbox Code Playgroud)

java rest json jackson deserialization

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

Scala-cats:记忆化支持

Scalaz 提供 Memo 用于记忆。我希望 scala-cats 也有类似的解决方案。一般来说,我有不同方法的特征:

trait t {
  def f1:Int = ???
  def f2(i:Int):Int = ???
  def f3(i:Int, s:String):String = ???
}
Run Code Online (Sandbox Code Playgroud)

如果 Casts 支持此类解决方案,请举例说明如何:

  1. 使用它来记忆所有以前定义的方法,以防可以修改源?

  2. 如何将其应用于外部代码,将记忆注入到客户端的调用中,而不触及现有服务

  3. 如何控制记忆的生命周期?一般来说,我需要保留每笔交易的结果。控制它的策略是什么?例子也会很棒!

scala memoization scala-cats

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

从 IDEA 连接到嵌入式 tomcat

我正在运行tomcat:

mvn tomcat7:run-war
Run Code Online (Sandbox Code Playgroud)

我发现在这里我可以设置调试参数。通过导出 maven 选项:

export MAVEN_OPTS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
mvn tomcat7:run-war
Run Code Online (Sandbox Code Playgroud)

我的第一个问题,如何从 IntelliJ IDEA 连接到 tomcat?像往常一样,我首先在IDEA中配置了tomcat本身,但是当我以嵌入式方式运行它时,我启动它的那一刻没有应用服务器。

我的第二个问题,我可以在文件中设置 MAVEN_OPTS 以跳过运行导出命令吗?我在 pom.xml 中读到这是不可能的。但是我在这里发现我可以%HOMEDRIVE%%HOMEPATH%\mavenrc_pre.bat为此目的使用该文件。但是我在关于 maven 的书中找不到任何关于这个文件用法的信息。你不知道,它有效吗?为了检查它,首先我需要解决从idea连接到tomcat的第一个问题。

java debugging intellij-idea maven embedded-tomcat-7

4
推荐指数
1
解决办法
7395
查看次数

JUnit从Spring上下文中的测试中排除基类

我的所有单元测试都有与Spring注释相同的标题:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/spring-master.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
@Transactional()
Run Code Online (Sandbox Code Playgroud)

我将它们移动到基类,我的所有测试现在扩展它:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/spring-master.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
@Transactional()
public class DomainObjectBaseTest {
...
public class SomeTest extends DomainObjectBaseTest {
Run Code Online (Sandbox Code Playgroud)

现在,当我正在运行所有测试时,我正在获取DomainObjectBaseTest:

java.lang.Exception: No runnable methods
Run Code Online (Sandbox Code Playgroud)

我的问题是如何避免它?我可以删除@RunWith,但在这种情况下,我将必须将注释应用于所有其他测试.额外代码太多,不喜欢它.

也许,作为替代方案,我可以在Spring组注释,命名它,并从我的测试中引用该组,请告诉我是否可能.在这种情况下,我将删除基类.

并且可能有一种方法可以告诉我们这个类不应该被测试.我正在使用JUnit4.

java spring unit-testing

4
推荐指数
1
解决办法
596
查看次数

使用Spring Mvc测试测试Spring Security Controller

登录jsp表单和spring security xml配置如下:

<spring:url value="/j_spring_security_check" var="login" />
<form action="${login}" method="POST">
<fieldset>
    <legend>Login</legend>
        <input type="text" name="j_username" id="username" placeholder="Usename"/>
        <input type="text" name="j_password" id="password" placeholder="Password"/>
        <input type="submit" value="Login" />
</fieldset>
</form>
...
<security:form-login login-page="/public/authentication/login.htm"
     login-processing-url="/j_spring_security_check"
     default-target-url="/public/index.htm"
     authentication-failure-url="/public/authentication/login.htm?authenticationNok=1"/>
Run Code Online (Sandbox Code Playgroud)

这是形式总结的测试:

@Test
public void testLoginPostController() throws Exception {
    Account account = new AccountBuilder("test", "test", "test@gmail.com", Address.FAKE_EMPTY_ADDRESS4TESTS)
            .build();
    this.mockMvc.perform(post("/j_spring_security_check").param("j_username", account.getUsername()).param("j_password", "test"))
            .andDo(print())
            .andExpect(status().isMovedTemporarily())
            .andExpect(view().name("redirect:/public/index.htm"));
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了: java.lang.AssertionError: Status expected:<302> but was:<404>

当我在浏览器中打开登录页面时,我看到生成的表单是:

<form action="/SpringMvcExample/j_spring_security_check" method="POST">
Run Code Online (Sandbox Code Playgroud)

好的,我试着改变测试:

this.mockMvc.perform(post("/SpringMvcExample/j_spring_security_check").param("j_username", account.getUsername()).param("j_password", "test"))
Run Code Online (Sandbox Code Playgroud)

但得到了相同的结果.同时,当我在浏览器中提交登录表单时,它会将我重定向到public/index.htm页面,如测试中的exptect.

我究竟做错了什么?

java spring spring-mvc spring-security spring-mvc-test

4
推荐指数
1
解决办法
2474
查看次数

Exj JS 5,来自ViewController的Access Store/Model

我想从ViewController加载项目/项目.这是一个例子:

Ext.define('MyApp.model.User', {
   extend: 'Ext.data.Model',
   fields: ['name', 'email'],
   proxy: {
       type: 'rest',
       ...
   }
});

Ext.define('MyApp.store.User', {
   extend: 'Ext.data.Store',
   model: 'MyApp.model.User',
   data : [
    {firstName: 'Seth',    age: '34'},
    {firstName: 'Scott', age: '72'},
    {firstName: 'Gary', age: '19'},
    {firstName: 'Capybara', age: '208'}
   ]
});

Ext.define('MyApp.view.MainController', {
    extend: 'Ext.app.ViewController',
    alias: 'controller.main',

    init: function() {
        //how to access store here and load items, using its load() method?
        //how to access model here and load an item, using its load() method?
    }
});
Run Code Online (Sandbox Code Playgroud)
  1. 如何从这里访问商店并使用其load()方法加载项目?
  2. 如何使用其加载方法访问模型并加载项目?

javascript extjs extjs-mvc extjs5

4
推荐指数
1
解决办法
3567
查看次数

JAX RS Client API拦截器

有没有办法通过拦截器向请求添加标头,但是当使用JAX RS Client API时,不能通过显式设置标头:

Client client = ClientBuilder.newClient();
Response response = client.target("someUrl").path("somePath").request().get();
Run Code Online (Sandbox Code Playgroud)

在AOP方式

java aop jax-rs interceptor

4
推荐指数
1
解决办法
1004
查看次数