我正在尝试在Spring MVC应用程序中实现用于记录请求和响应的过滤器.我使用以下代码:
@Component
public class LoggingFilter extends OncePerRequestFilter {
private static final Logger LOGGER = LoggerFactory.getLogger(LoggingFilter.class);
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);
ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);
LOGGER.debug(REQUEST_MESSAGE_FORMAT, requestWrapper.getRequestURI(), requestWrapper.getMethod(), requestWrapper.getContentType(),
new ServletServerHttpRequest(requestWrapper).getHeaders(), IOUtils.toString(requestWrapper.getInputStream(), UTF_8));
filterChain.doFilter(requestWrapper, responseWrapper);
LOGGER.debug(RESPONSE_MESSAGE_FORMAT, responseWrapper.getStatus(), responseWrapper.getContentType(),
new ServletServerHttpResponse(responseWrapper).getHeaders(), IOUtils.toString(responseWrapper.getContentInputStream(), UTF_8));
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我得到了我的请求,并按预期记录了.这是日志:
2016-10-08 19:10:11.212 DEBUG 11072 --- [qtp108982313-19] by.kolodyuk.logging.LoggingFilter
----------------------------
ID: 1
URI: /resources/1
Http-Method: GET
Content-Type: null
Headers: {User-Agent=[curl/7.41.0], Accept=[*/*], …Run Code Online (Sandbox Code Playgroud) 我的数据层中有几个实体存储在特定模式中.例如:
@Entity
@Table(name = "FOO", schema = "DUMMY")
public class Foo {}
Run Code Online (Sandbox Code Playgroud)
我正在尝试设置H2嵌入式数据库,以便对我的数据层进行集成测试.我正在@DataJpaTest为我的测试使用注释来自动配置H2嵌入式数据库.但是,表的创建失败,因为DUMMY在初始化时不会创建模式.
有关如何在测试用例中创建表之前创建模式的任何想法?
我试过使用@Sql(statements ="CREATE SCHEMA IF NOT NOT DISMY")但没有成功.
此外,我试图spring.datasource.url = jdbc:h2:mem:test;INIT=CREATE SCHEMA IF NOT EXISTS DUMMY在我的test.properties文件中设置TestPropertySource("classpath:test.properties"),但这也不起作用.
integration-testing h2 spring-test embedded-database spring-boot
假设我们有以下API:
GET /api/guests/{id}
Run Code Online (Sandbox Code Playgroud)
GET /api/guests?name=dummy
Run Code Online (Sandbox Code Playgroud)
当没有符合条件的客人时,我应该返回哪个状态代码?我的意思是没有名字假的客人.
应该是404,204还是200空数组?
我需要将以下格式的String解析为2015-01-15-05:00UTC中的LocalDate(或其他).问题是以下代码:
System.out.println(LocalDate.parse("2015-01-15-05:00", DateTimeFormatter.ISO_OFFSET_DATE));
Run Code Online (Sandbox Code Playgroud)
输出2015-01-15忽略偏移量.期望的输出是2015-01-16
提前致谢!
我有以下映射:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Vehicle {
@Id
@GeneratedValue
Long id;
}
@Entity
@Table(name = "car")
@AttributeOverride(name = "id", column = @Column(name = "car_id"))
public class Car extends Vehicle {
}
@Entity
@Table(name = "bus")
@AttributeOverride(name = "id", column = @Column(name = "bus_id"))
public class Bus extends Vehicle {
}
Run Code Online (Sandbox Code Playgroud)
而我想要实现的是查询不同的表以检索两者Car和Bus实体.为此,我创建了以下Spring Data存储库
public interface VehicleRepository extends CrudRepository<Vehicle, Long> {
}
Run Code Online (Sandbox Code Playgroud)
并试着像这样使用它: vehicleRepository.findAll();
但是,在这种情况下,我得到了java.sql.SQLSyntaxErrorException: ORA-00904: "KEY": invalid identifier.好像使用@Inheritance连同@AttributeOverride用于 …
我想序列化一个Book对象:
public class Book implements DataSerializable {
@Override
void writeData(ObjectDataOutput out) throws IOException {
...
}
@Override
void readData(ObjectDataInput in) throws IOException {
...
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我不知道如何实例化ObjectDataOutput/ObjectDataInput类型的对象来序列化/反序列化Book对象.
ObjectDataOutputStream实现了ObjectDataOutput,但我不知道如何实例化这个对象,因为它需要没有公共构造函数的SerializationService对象.
那么,有没有办法从FileOutputStream/FileInputStream创建一个ObjectDataOutput/ObjectDataInput对象?
提前致谢
在CXF 2中,我可以像这样设置级别:
<jaxws:client name="client">
<jaxws:features>
<bean class="org.apache.cxf.transport.jms.JMSConfigFeature">
<property name="jmsConfig" ref="jmsConfig"/>
</bean>
</jaxws:features>
</jaxws:client>
<bean id="jmsConfig" class="org.apache.cxf.transport.jms.JMSConfiguration">
<property name="cacheLevel" value="3"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
但是,在CXF 3 cacheLevel中缺少属性org.apache.cxf.transport.jms.JMSConfiguration.
如何在CXF 3中设置缓存级别?
提前致谢.
我有一个JMS队列.收到消息后,需要将其存储到DB.然后根据某些条件,我希望以固定费率将此消息发送给第三方服务,因此我使用限制.
我有以下路线:
from("jms:queue")
.bean(persistingListener)
.choice()
.when(some condition ..)
.throttle(5)
.asyncDelayed()
.bean(thirdPartyServiceClient)
.endChoice();
Run Code Online (Sandbox Code Playgroud)
但是,整个路由受到限制,而不是与第三方服务客户端相关的部分.我的意思是,如果我在队列中放入100条消息,则只会读取前5条消息.因此,在这种情况下,处理不需要第三方服务的消息会被延迟.
关于如何仅限制与第三方服务相关的部分的任何想法?
提前致谢
我有一个第三方应用程序,它将一些消息放入JMS队列.我还有一个应用程序从该队列中读取消息.根据消息类型,我将此消息保存到DB或将其发送到第三方服务.此外,我们不应超过一些固定的每秒呼叫限制,以免超载第三方.
目前,我想到了这个用例的两个解决方案.
第一个是要求第三方发送一些自定义标头,以便JMS使用者能够使用JMS选择器过滤消息.因此,在这种情况下,我们将能够创建两个使用者,第一个将能够读取消息并将其保存到DB,第二个将使用一些限制/轮询机制在特定负载下向第三方发送消息.但是这种方法对我来说不起作用,因为第三方添加这些自定义标题需要很长时间.像Camel这样的东西:
from("jms:queue?selector=firstSelector")
.bean(dbSaver);
from("jms:queue?selector=secondSelector")
.throttle(10)
.bean(httpClient);
Run Code Online (Sandbox Code Playgroud)
第二个是创建另外两个JMS队列和一个将在这些队列之间拆分消息的处理器.然后采用与第一个解决方案相同的逻辑.但是,这意味着应该添加2个额外的JMS队列.在骆驼:
from("jms:parentQueue")
.choice()
.when(body().contains(...))
.to("jms:fistChildQueue")
.otherwise()
.to("jms:secondChildQueue")
.end()
from("jms:fistChildQueue")
.bean(dbSaver);
from("jms:secondChildQueue")
.throttle(10)
.bean(httpClient);
Run Code Online (Sandbox Code Playgroud)
此外,我一直在考虑使用两个内存中队列而不是JMS队列.但是,在这种情况下,如果JMS队列中存在大量消息,我们很容易陷入内存困境.
有人可以建议这个用例的架构设计吗?用Camel Route风格来看它会很棒.
假设我们有这么简单的解析器:
public class ResourceManager {
private final static Logger LOG = Logger.getLogger(ResourceManager.class);
public Museum parseJSONFile(String filePath) /*throws IOException ???? */ {
Museum museum = null;
try {
ObjectMapper objectMapper = new ObjectMapper();
museum = objectMapper.readValue(new File(filePath), Museum.class);
} catch(IOException e) {
LOG.error(e);
}
return museum;
}
}
Run Code Online (Sandbox Code Playgroud)
是否应该在方法或调用代码中捕获异常?哪种变体更好?
我有包含一些数据的文本文件。所有段落都以四个空格开头。我的目的是将这段文字分成几段。
首先,我使用以下方法阅读全文:
public String parseToString(String filePath) throws IOException{
return new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
}
Run Code Online (Sandbox Code Playgroud)
然后我使用此代码拆分字符串:
private static final String PARAGRAPH_SPLIT_REGEX = "(^\\s{4})";
public void parseText(String text) {
String[] paragraphs = text.split(PARAGRAPH_SPLIT_REGEX);
for (int i = 0; i < paragraphs.length; i++) {
System.out.println("Paragraph: " + paragraphs[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
我的输入文件是:
Hello, World!
Hello, World!
Run Code Online (Sandbox Code Playgroud)
输出是:
Paragraph:
Paragraph: Hello, World!!!
Hello, World!!!
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
java ×8
jms ×3
apache-camel ×2
spring-boot ×2
throttling ×2
cxf ×1
h2 ×1
hazelcast ×1
hibernate ×1
http ×1
java-8 ×1
java-time ×1
jpa ×1
parsing ×1
regex ×1
rest ×1
servlets ×1
spring ×1
spring-mvc ×1
spring-test ×1