目前尚不清楚是否必须关闭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,也不会关闭它。
请比较以下内容:
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,但我认为目前无关紧要.
请解释我是不是错了.
谢谢
我有以下实体映射:
@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) 在以前版本的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) 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 支持此类解决方案,请举例说明如何:
使用它来记忆所有以前定义的方法,以防可以修改源?
如何将其应用于外部代码,将记忆注入到客户端的调用中,而不触及现有服务
如何控制记忆的生命周期?一般来说,我需要保留每笔交易的结果。控制它的策略是什么?例子也会很棒!
我正在运行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的第一个问题。
我的所有单元测试都有与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.
登录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.
我究竟做错了什么?
我想从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)
有没有办法通过拦截器向请求添加标头,但是当使用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 ×7
spring ×3
jax-rs ×2
aop ×1
debugging ×1
extjs ×1
extjs-mvc ×1
extjs5 ×1
interceptor ×1
jackson ×1
javascript ×1
jpql ×1
json ×1
many-to-many ×1
maven ×1
memoization ×1
memory-leaks ×1
optimization ×1
oracle ×1
rest ×1
scala ×1
scala-cats ×1
spring-mvc ×1
sql ×1
unit-testing ×1