小编Sta*_*yuk的帖子

ContentCachingResponseWrapper生成空响应

我正在尝试在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)

servlets spring-mvc servlet-filters spring-boot

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

春季启动.@DataJpaTest H2嵌入式数据库创建模式

我的数据层中有几个实体存储在特定模式中.例如:

@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

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

REST API中搜索的响应状态代码

假设我们有以下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空数组?

rest http http-status-codes

11
推荐指数
2
解决办法
3090
查看次数

Java 8偏移日期解析

我需要将以下格式的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

提前致谢!

java timezone-offset java-8 java-time

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

具有不同Id名称的每类继承的JPA表

我有以下映射:

@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)

而我想要实现的是查询不同的表以检索两者CarBus实体.为此,我创建了以下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用于 …

java hibernate jpa table-per-class spring-data-jpa

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

Hazelcast 3.5使用DataSerializable进行序列化

我想序列化一个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对象?

提前致谢

java serialization hazelcast

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

CXF 3缓存级别

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中设置缓存级别?

提前致谢.

java spring jms cxf

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

Apache Camel.节流部分路线

我有一个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条消息.因此,在这种情况下,处理不需要第三方服务的消息会被延迟.

关于如何仅限制与第三方服务相关的部分的任何想法?

提前致谢

java throttling jms apache-camel

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

JMS队列拆分.企业整合.Apache Camel

我有一个第三方应用程序,它将一些消息放入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风格来看它会很棒.

java throttling jms apache-camel enterprise-integration

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

解析器中的Java异常处理

假设我们有这么简单的解析器:

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)

是否应该在方法或调用代码中捕获异常?哪种变体更好?

java parsing exception-handling

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

使用正则表达式 JAVA 将文本拆分为段落

我有包含一些数据的文本文件。所有段落都以四个空格开头。我的目的是将这段文字分成几段。

首先,我使用以下方法阅读全文:

    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 regex

3
推荐指数
1
解决办法
5484
查看次数