# devopsgym / testgen__alibaba__fastjson2-2559

- taskset: [devopsgym](https://harnessreport.com/tasks/devopsgym.md)
- difficulty: hard
- category: test-generation
- language: 
- runnable from the site: no
- agent timeout: 3000s

## Results by harness

_none yet_

## Instruction

```
The following text contains a user issue (in <issue/> brackets) posted at a repository. Further, you are provided with file contents of several files in the repository that contain relevant code (in <code> brackets). It may be necessary to use code from third party dependencies or files not contained in the attached documents however. Your task is to identify the issue and implement a test case that verifies a proposed solution to this issue. More details at the end of this text.
<issue>
      ### 请描述您的需求或者改进建议
背景如下：
1、我们会把`java`对象通过`fastjson`转为`String`然后通过**MQ** 发送出来，在接收端会再通过`fastjson`把`String`转化`JSONObject`
```
    public void handleChannel(String data) throws PropertyMapperException {
        JSONObject jsonData = JSON.parseObject(data);
        ViewMO inputMO = jsonData.toJavaObject(ViewMO.class);
        ImportBatchDetailDO task = new ImportBatchDetailDO();
        task.setData(jsonData);
        task.setSyncImportTaskId(inputMO.getId());
        importBatchDetailRepo.save(task);
    }
```
2、由于fastjson缺省反序列化带小数点的数值类型为BigDecimal，所以上面`jsonData`这个`JSONObject`里面的小数都会被转为`BigDecimal`, 而由于我们的数据库用的是`mongodb`，所以存储进`mongodb`时这个`BigDecimal`又会自动被转为`org.bson.types.Decimal128`
3、但是当我们从`MongoDB`读回这个`JSONObject`对象时，由于`java`映射这个`JSONObject`的小数的类型是`Double`，这时由于`fastjson`代码里的`ObjectReaderProvider.typeConverts`并没有把`org.bson.types.Decimal128`转为`Double`的**Converts**, 这时就会报**can not cast to java.lang.Double, from class org.bson.types.Decimal128**错误，以下是具体的代码：
```
@SpringBootTest
public class BigDecimalTest {

    @Autowired
    private ImportBatchDetailRepo importBatchDetailRepo;
    @Test
    public void testBigDecimal() {
        ImportBatchDetailDO importBatchDetailDO = importBatchDetailRepo.findById("64dc97577e47e340a7165e0b");
        JSONObject data = importBatchDetailDO.getData();
        ImportRefinedMO javaObject = data.toJavaObject(ImportRefinedMO.class);

    }
}

@Getter
@Setter
public class ImportBatchDetailDO {

    private String syncImportTaskId;
    private JSONObject data;

}

@Getter
@Setter
public class ImportRefinedMO {

    private Double holidayHour;
}
```

### 请描述你建议的实现方案
只要优化`TypeUtils.cast`这个方法，增加支持从`org.bson.types.Decimal128`转为`Double`就可以了，以下是具体的代码可能实现并不是最优美的方式，但是以下这个实现经过我的测试是可以解决我上面这个问题，在`TypeUtils`类的**1525**行增加以下代码:
```
        String objClassName = obj.getClass().getName();
        if (obj instanceof Number && objClassName.equals("org.bson.types.Decimal128") && targetClass == Double.class) {
            ObjectWriter objectWriter = JSONFactory
                    .getDefaultObjectWriterProvider()
                    .getObjectWriter(obj.getClass());
            if (objectWriter instanceof ObjectWriterPrimitiveImpl) {
                Function function = ((ObjectWriterPrimitiveImpl<?>) objectWriter).getFunction();
                if (function != null) {
                    Object apply = function.apply(obj);
                    Function DecimalTypeConvert = provider.getTypeConvert(apply.getClass(), targetClass);
                    if (DecimalTypeConvert != null) {
                        return (T) DecimalTypeConvert.apply(obj);
                    }
                }
            }
        }
```

</issue>
Please generate test cases that check whether an implemented solution resolves the issue of the user (at the top, within <issue/> brackets).
You may apply changes to several files.
Apply as much reasoning as you please and see necessary.
Make sure to implement only test cases and don't try to fix the issue itself.
You are not allowed to read git history.
```
---
Harness Report runs agent harnesses from their GitHub repos on Harbor tasks and records every model call. Every page is also `.md` and `.json`; index: https://harnessreport.com/llms.txt · MCP: https://harnessreport.com/mcp
